- 力扣题号:704
- 解法①:双闭区间。
//一刷<<代码随想录>>
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() -1;
while(left <= right){
int middle = left + ((right - left)/2);//求中位数。化加为减,有效避免数溢出。
if(nums[middle] > target){
right = middle -1;
}else if(nums[middle] < target){
left = middle +1;
}else{
return middle;
}
}
return -1;
}
};
- 解法②:左闭右开。(有局限性)
//一刷《代码随想录》
//数组章,二分查找,左闭右开法。有使用限制:当数组只有一位,左闭右开法报错。因为本方法中,是[left,right),而不允许left = right。
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() -1;
while(left < right){
//下面的">>"运算符是右移一位的作用,相当于除以二了。但比除以二更高效。
int middle = left + ((right - left) >> 1);
if(nums[middle] < target){
left = left +1;
}else if(nums[middle] > target){
right = left -1;
}else{
return middle;
}
}
return -1;
}
};
- 额外收获:
- 适当的化加为减,可避免数据溢出。
- 移位运算符">>","<<",在作用上可相当于除以二,但比除以二快:
左移位运算符<< :高位溢出舍弃,低位补0;
右移位运算符>> :低位溢出舍弃,高位补0。