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

相关推荐
yongui478346 小时前
MATLAB的指纹识别系统实现
算法
高山上有一只小老虎6 小时前
翻之矩阵中的行
java·算法
jghhh016 小时前
RINEX文件进行卫星导航解算
算法
爱思德学术6 小时前
中国计算机学会(CCF)推荐学术会议-A(计算机科学理论):LICS 2026
算法·计算机理论·计算机逻辑
CVHub6 小时前
多模态图文训推一体化平台 X-AnyLabeling 3.0 版本正式发布!首次支持远程模型推理服务,并新增 Qwen3-VL 等多款主流模型及诸多功能特性,等
算法
hoiii1877 小时前
MATLAB实现Canny边缘检测算法
算法·计算机视觉·matlab
qq_430855887 小时前
线代第二章矩阵第四课:方阵的幂
算法·机器学习·矩阵
roman_日积跬步-终至千里7 小时前
【计算机设计与算法-习题2】动态规划应用:矩阵乘法与钢条切割问题
算法·矩阵·动态规划
kupeThinkPoem7 小时前
计算机算法导论第三版算法视频讲解
数据结构·算法
sali-tec7 小时前
C# 基于halcon的视觉工作流-章67 深度学习-分类
开发语言·图像处理·人工智能·深度学习·算法·计算机视觉·分类