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

相关推荐
奋进的小暄9 分钟前
贪心算法(15)(java)用最小的箭引爆气球
算法·贪心算法
Scc_hy22 分钟前
强化学习_Paper_1988_Learning to predict by the methods of temporal differences
人工智能·深度学习·算法
巷北夜未央23 分钟前
Python每日一题(14)
开发语言·python·算法
javaisC25 分钟前
c语言数据结构--------拓扑排序和逆拓扑排序(Kahn算法和DFS算法实现)
c语言·算法·深度优先
爱爬山的老虎25 分钟前
【面试经典150题】LeetCode121·买卖股票最佳时机
数据结构·算法·leetcode·面试·职场和发展
SWHL26 分钟前
rapidocr 2.x系列正式发布
算法
雾月551 小时前
LeetCode 914 卡牌分组
java·开发语言·算法·leetcode·职场和发展
想跑步的小弱鸡1 小时前
Leetcode hot 100(day 4)
算法·leetcode·职场和发展
Fantasydg1 小时前
DAY 35 leetcode 202--哈希表.快乐数
算法·leetcode·散列表
jyyyx的算法博客1 小时前
Leetcode 2337 -- 双指针 | 脑筋急转弯
算法·leetcode