【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位。

相关推荐
好玩的Matlab(NCEPU)1 分钟前
卡尔曼滤波器
人工智能·算法
zhangpz_2 分钟前
c ++零基础可视化——数组
c++·算法
SoraLuna31 分钟前
「Mac玩转仓颉内测版14」PTA刷题篇5 - L1-005 考试座位号
算法·macos·cangjie
颹蕭蕭1 小时前
均值方差增量计算
算法·均值算法·概率论
EQUINOX11 小时前
树状数组+概率论,ABC380G - Another Shuffle Window
算法
闫铁娃1 小时前
【AtCoder】Beginner Contest 380-C.Move Segment
c语言·开发语言·数据结构·c++·算法·线性回归
前鼻音太阳熊2 小时前
【数据结构和算法】-布隆过滤器
数据结构·算法
Star Patrick2 小时前
算法训练(leetcode)二刷第二十五天 | *134. 加油站、*135. 分发糖果、860. 柠檬水找零、*406. 根据身高重建队列
python·算法·leetcode
南宫生2 小时前
力扣-Hot100-链表其一【算法学习day.34】
java·学习·算法·leetcode·链表
Espresso Macchiato2 小时前
Leetcode 3354. Make Array Elements Equal to Zero
leetcode·累积数组·leetcode 3354·leetcode easy·leetcode周赛424