注意一般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
就是区间的中间位置,这样可以避免整型溢出的问题。
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。