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

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

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

二分法的模板写法:

(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++实现弹窗效果

      C++实现弹窗效果

      1.格式C++实现弹窗效果需要用到messagebox,这个我在C#中用过,C++也有类似用法。messagebox函数,需要引入<windows.h>头文件2.简单用法#include&...

      【C++图形化编程】EasyX的基本概念

      一、颜色        EasyX 使用 24bit 真彩色,不支持调色板模式。     ...

      C++小游戏—弹跳小球

      C++小游戏—弹跳小球

      首先,要注意屏幕直角坐标系的问题,不然的话,后面移动过程中一定会出错。然后,利用printf函数在屏幕坐标(x,y)处显示一个静止的小球字符‘O’,注意屏幕坐标系的原点在左上方,参考代码#includ...

      EasyX—制作复杂动画效果

      这篇文章来简单学习一下复杂动画效果。本文资源下载地址:这里参考代码#include <graphics.h> #include <conio.h> in...

      C++产生随机数

      0.前言想做一个掷骰子的小游戏,需要用到随机数函数,于是查了一些资料,整理了一下。1.随机数函数C++产生随机数需要用到rand()和srand()函数。期中,(1)rand()叫随机数发生器,所在头...

      C++小游戏制作基础—键盘事件

      0.前言我们制作小游戏的时候,需要用到键盘,一般是控制上下左右,这个时候就需要用到键盘事件了。1.键盘事件需要用到<conio.h>头文件,和_kbhit()函数程序参考:#include...