二分查找,查找有序可重复数列的最左和最右出现的数的下标。
可以参考,通过二分的写法理解循环不变式:http://www.cnblogs.com/wuyuegb2312/archive/2013/05/26/3090369.html
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int left = -1, right = -1;
int len = nums.size();
if(len == 0) {
return vector<int> {left, right};
}
// left index
int mid;
int lf = 0, rt = len-1;
while(lf < rt) {
mid = lf + (rt-lf) / 2;
if(nums[mid] >= target) rt = mid;
else lf = mid + 1;
}
if(nums[lf] == target) left = lf;
// right index
lf = 0; rt = len-1;
bool flag = false;
while(lf < rt - 1) {
mid = lf + (rt - lf) / 2;
if(nums[mid] <= target) lf = mid;
else rt = mid;
}
if(nums[rt] == target) right = rt;
else if(nums[lf] == target) right = lf;
return vector<int>{left, right};
}
};