当前位置:首页 > 趣味小程序 > 正文内容

【二分与分治】中间值、边界值、循环条件、模块写法(2)

亿万年的星光5年前 (2021-02-27)趣味小程序1829

二分法的模板写法:

(1)标准的二分查找(寻找的值正好等于x的任意位置)

int search(int A[], int n, int target)  
{  
    int left = 0, right = n-1;  
    while(left <= right)  
    {  
        // 注意:若使用(low+high)/2求中间位置容易溢出  
        int mid = left+((right-left)>>1);   
        if(A[mid] == target)  
            return mid;  
        else if(A[mid] < target)  
            left = mid+1;  
        else // A[mid] > target  
            right = mid-1;  
    }


  • 循环条件: left <= right

  • 中间位置计算: mid = left + ((right -left) >> 1)

  • 左边界更新:left = mid + 1

  • 右边界更新: right = mid - 1

  • 返回值: mid / -1

例如下面这题:

【题目描述】

给定一个非负整数x,计算并返回x的平方根。因为返回类型是整数,所以小数位数被截断,并且只返回结果的整数部分。

int mySqrt(int x) {        if (x <= 1) return x;        int left = 1;        int right = x - 1;
        while (left <= right) {            int mid = left + ((right - left) >> 1);            if (mid > x / mid) {                right = mid - 1;
            } else if (mid < x / mid) {                if (mid + 1 > x / (mid + 1)) return mid;                left = mid + 1;
            } else {
                return mid;
            }
        }
        return -1; // only for return a value
    }


(2)左端点值(左边界)

利用二分法寻找左边界是二分查找的一个变体,应用它的题目常常有以下几种特性之一:

    1. 数组有序,但包含重复元素

    2. 数组部分有序,且不包含重复元素

    3. 数组部分有序,且包含重复元素

    既然要寻找左边界,搜索范围就需要从右边开始,不断往左边收缩,也就是说即使我们找到了nums[mid] == target, 这个mid的位置也不一定就是最左侧的那个边界,我们还是要向左侧查找,所以我们在nums[mid]偏大或者nums[mid]就等于目标值的时候,继续收缩右边界,算法模板如下:


    int search(int A[], int n, int target) {
    	int left = 0, right = n-1;
    	while(left < right) {
    		int mid = left+(right-left)/2;
    		if(A[mid] < target)
    			left =mid+1;
    		else
    			right = mid;
    	}
    	return right;
    }



    扫描二维码推送至手机访问。

    版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

    分享给朋友:

    相关文章

    【C++图形化编程】EasyX实现弹跳小球

    【C++图形化编程】EasyX实现弹跳小球

    前面的文章实现了C++控制台显示一个弹跳的小球,这篇文章使用EasyX实现一个带有界面的弹跳小球的效果。首位,我们需要准备好EasyX。然后让EasyX画一个小的圆。然后我们使用前面学过的判断边界的函...

    C++小游戏—简单飞机大战(1)

    C++小游戏—简单飞机大战(1)

    前面文章简单实现了弹球操作,这篇文章我们介绍一下如何实现简单的飞机大战操作。这篇文章我们要实现的效果如下:第一步:整体思路在某个点画出飞机的形状获取用户按下哪个按键根据按键移动飞机的位置按空格键发射子...

    【C++图形化编程】flappy bird(2)—游戏逻辑与完善

    【C++图形化编程】flappy bird(2)—游戏逻辑与完善

    0.前言    上一篇中,我们简单完成了flappy的图像导入和基本架构。这一篇文章中,我们继续完善。1.游戏逻辑这个游戏的简单逻辑就是:(1)初始状态(游戏一...

    C++自动关机小程序

    /*  C++ 自动关机程序  实现原理:调用计算机内部的shutdown 命令       ...

    【C++图形化编程】C++图形库的引入

    【C++图形化编程】C++图形库的引入

    0.前言前面的文章用C++的控制台完成了小游戏,但是我们平常玩的游戏都是有图形化界面,我们从这篇文章开始就引入一个C++图形库—EasyX。C++的图形库有很多,EasyX是最适合上手的图形库。1.简...

    C++ 如何监听用户按下了哪个按键

    想做一款小游戏,键盘事件是必须要了解的。前面的文章简单介绍过键盘事件,这篇文章简单实现了监听用户键盘的操作,主要监听“WASD”以及“上下左右”键参考代码#include<cstdio>...