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

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

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

二分法的模板写法:

(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++小游戏—猜数游戏

      0.游戏内容玩家猜电脑产生的数字,一个两次机会,才对了给提示,猜错减去一次机会。1.参考代码#include<iostream>#include<cstdlib>#includ...

      C++小游戏——flappy bird简单实现

      C++小游戏——flappy bird简单实现

      上一篇小游戏中,我们简单实现了打砖块小游戏。这一篇中,我们根据前面的框架,简单实现flappy bird小游戏。1.游戏框架   2.实现下落的小鸟#include &l...

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

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

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

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

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

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

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

       【C++图形化编程】飞机大战1—基础资源导入与基本框架

      【C++图形化编程】飞机大战1—基础资源导入与基本框架

      0.前言前面几篇文章中,我们实现了flappy的小游戏,这篇文章中,我们尝试制作飞机大战的游戏。首先,效果图如下:基础资源导入下载图片及音乐资源:https://box356.lanzoui.com/...