<aside> 💡
思路重点:区间的定义——是左闭右闭还是左闭右开?
· 右开还是右闭决定了right指向的值能否被访问
区间的定义回答了以下问题:
1、right的初始值是nums.size()还是nums.size()-1?
2、循环条件是left < right还是left <= right?
3、left与right如何更新,如:right的更新是right = middle还是right = middle - 1?
</aside>
左闭右开写法
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size(); // 初始值等于size
while (left < right) {
int middle = (left + right) / 2;
if (nums[middle] == target)
return middle;
else if (nums[middle] > target) {
right = middle; // 右开,所以直接等于middle
}
else {
left = middle + 1;
}
}
return -1;
}
左闭右闭写法
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
// 右闭时条件为<=
while (left <= right) {
//int middle = (left + right) / 2; // 这样的写法可能int越界
int middle = left + (right - left) / 2;
if (nums[middle] == target)
return middle;
else if (nums[middle] > target) {
right = middle - 1; // 右闭时,middle不应该在搜索区间内
}
else {
left = middle + 1;
}
}
return -1;
}