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

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

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

二分法的模板写法:

(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++小游戏—贪吃蛇(1)

      0.前言c++小游戏来到了第二个,第二个小游戏是贪吃蛇。首先来分析一下需求。我们需要一个函数专门来绘制地图的。在地图上随机生成“食物”。按键函数,用来监听键盘事件。蛇的状态函数。移动函数等。1.参考代...

      【C++图形化编程】播放背景音乐

      再做小游戏的时候有的时候需要背景音乐,这一点EasyX也可以实现。需要的头文件#include <mmsystem.h>  //多媒体设备接口 #pragm...

      C++在指定位置输出符号

      C++在指定位置输出符号

      0.前言需要做控制台小游戏,需要获取光标在控制台的位置,从网上查到了gotoxy()函数可以实现,但是在DEVC++环境中直接调用这个gotoxy()会报错,于是查了一些资料,把过程记录下来。1.过程...

      C++实现走迷宫小游戏

      1.简单版本简单版本是利用字符数组实现的,利用字符数组设定入口和出口,用户每次按键就刷新一下当前字符数组。参考代码:#include<stdio.h>#include<stdlib....

      C++产生随机数

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

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

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