【leetcode】704. 二分查找

注意一般mid = left + (right-left)/2;

不要用mid = (right - left)/2

中间值的计算需要考虑到整型溢出的问题。

如果使用 mid = (right - left) / 2 的方式计算中间值,那么在 right 和 left 的值接近极限值的情况下,可能会导致计算出的中间值发生整型溢出,从而得到错误的结果。
为了避免这种情况,我们一般使用 mid = left + (right - left) / 2 的方式来计算中间值。这种方式可以保证计算过程中不会出现整型溢出的问题。
具体来说,right - left要查找区间的长度 ,而 (right - left) / 2区间长度的一半 。因此,left + (right - left) / 2 就是区间的中间位置,这样可以避免整型溢出的问题。

cpp 复制代码
class Solution {
public:
    int search(vector<int>& nums, int target) {
        
        int left = 0;
        
        int right = nums.size()-1; 定义target在左闭右闭的区间里,[left, right]
        
        while(left <= right){//当left==right,区间[left, right]依然有效,所以用 <=
            
            int middle = left + ( ( right - left ) / 2 ); 防止溢出 等同于(left + right)/2
            
            if( target < nums[middle] ) {
                
                right = middle - 1;//target 在左区间,所以[left, middle - 1]
            
            }else if ( target > nums[middle] ){
                
                left = middle + 1;// target 在右区间,所以[middle + 1, right]
            
            }else{//nums[middle] == target
               
                return middle;// 数组中找到目标值,直接返回下标
            
            }
        }  
         // 未找到目标值  
        return -1;  
    }
};

整型溢出

在计算机中使用的整型数据类型(如int、long等)所能表示的范围之外进行运算时,结果会出现错误的情况。

例如,32位有符号整型的范围是 -2147483648 到 2147483647,如果进行加法运算 2147483647 + 1,由于结果超出了该数据类型的范围,会发生整型溢出,结果会变成 -2147483648。

int型是占4个字节

一个字节由8位二进制组成‌,即一个字节8位。

相关推荐
半盏茶香19 分钟前
扬帆数据结构算法之雅舟航程,漫步C++幽谷——LeetCode刷题之移除链表元素、反转链表、找中间节点、合并有序链表、链表的回文结构
数据结构·c++·算法
CodeJourney.38 分钟前
小型分布式发电项目优化设计方案
算法
带多刺的玫瑰1 小时前
Leecode刷题C语言之从栈中取出K个硬币的最大面积和
数据结构·算法·图论
Cando学算法1 小时前
Codeforces Round 1000 (Div. 2)(前三题)
数据结构·c++·算法
薯条不要番茄酱1 小时前
【动态规划】落花人独立,微雨燕双飞 - 8. 01背包问题
算法·动态规划
小林熬夜学编程1 小时前
【Python】第三弹---编程基础进阶:掌握输入输出与运算符的全面指南
开发语言·python·算法
字节高级特工1 小时前
【优选算法】5----有效三角形个数
c++·算法
小孟Java攻城狮7 小时前
leetcode-不同路径问题
算法·leetcode·职场和发展
查理零世7 小时前
算法竞赛之差分进阶——等差数列差分 python
python·算法·差分
小猿_0010 小时前
C语言程序设计十大排序—插入排序
c语言·算法·排序算法