1. 题目链接
2. 题目解析
在有序的数组中查找一个等于target的数的下标。下面来介绍一下适应大部分二分查找的两个模板。
2.1. 模板一
{
// 区间[left, right]
while(l < r)
{
int mid = (l + r) / 2;
if(条件成立) r = mid;
else l = mid + 1;
}
return r;
}
用模板一跑一下上面的示例。
当nums[mid] >= target,r = mid
那么下一步更新的就是l,然后根据循环条件就会退出,返回值是r,此时l和r是都指向同一个数的,退出条件是l < r。
2.2. 模板2
{
// 区间[left, right]
while(l < r)
{
int mid = (l + r + 1) / 2;
if(条件成立) l = mid;
else r = mid - 1;
}
return r;
}
详细的推导可以自行画图验证,这两个模板也是我从书上看到的,分享给大家,希望对大家有帮助。
3. 代码
3.1. 模板1代码
class Solution {
public:
int search(vector<int>& nums, int target)
{
int l = 0, r = nums.size() - 1;
while(l < r)
{
int mid = (l + r + 1) / 2;
if(nums[mid] <= target) l = mid;
else r = mid - 1;
}
return nums[r] == target ? r : -1;
}
};
3.2. 模板2代码
class Solution {
public:
int search(vector<int>& nums, int target)
{
int l = 0, r = nums.size() - 1;
while(l < r)
{
int mid = (l + r + 1) / 2;
if(nums[mid] <= target) l = mid;
else r = mid - 1;
}
return nums[r] == target ? r : -1;
}
};