1.题意
给定按升序排序的整数数组,找到target的起始位置和结束位置。
算法的运行时复杂度必须为O(log n)。
如果在数组中找不到目标,则返回[-1,-1]。
这是一道典型的二分查找的问题。
2.代码实现
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> res = {-1, -1};
if(nums.size() == 0)
return res;
//Find First Position
int lo = 0;
int hi = nums.size() - 1;
while(lo < hi) //如果这里是等号会陷入死循环
{
int mi = lo + (hi - lo) / 2; //mid是偏左的
if(nums[mi] < target)
lo = mi + 1;
else if(nums[mi] > target)
hi = mi - 1;
else
hi = mi;
}
//循环结束后lo = hi
if(nums[lo] != target)
return res;
//nums[lo, nums.size() - 1]之间Find Last Position
res[0] = lo;
hi = nums.size() - 1;
while(lo < hi)
{
int mi = lo + (hi - lo) / 2 + 1; //中点偏右
if(nums[mi] < target)
lo = mi + 1;
else if(nums[mi] > target)
hi = mi - 1;
else
lo = mi;
}
res[1] = hi;
return res;
}
};