题目:
Given a sorted array of integers, find the starting and ending position of a given target value.
Your algorithm's runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1]
.
For example,
Given [5, 7, 7, 8, 8, 10]
and target value 8,
return [3, 4]
.
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> res(2);
if(nums.empty()) return res;
res[0] = searchLowerBound(nums, 0, nums.size()-1, target);
if(-1 != res[0]) res[1] = searchUpperBound(nums, 0, nums.size()-1, target);
else res[1] = -1;
return res;
}
private:
int searchLowerBound(vector<int>& nums, int start, int end, int target){
<span style="white-space:pre"> </span>if (start == end) return target == nums[start] ? start : -1;
int mid = (start + end) >> 1;
if (nums[mid] == target && (mid == start || target != nums[mid - 1])) return mid;
if (target > nums[mid]) return searchLowerBound(nums, mid + 1, end, target);
else return searchLowerBound(nums, start, mid, target);//如果target == nums[mid],继续向左查找
}
int searchUpperBound(vector<int>& nums, int start, int end, int target){
<span style="white-space:pre"> </span>if (start == end) return target == nums[start] ? start : -1;
int mid = (start + end) >> 1;
if (nums[mid] == target && target != nums[mid + 1]) return mid;
if (target >= nums[mid]) return searchUpperBound(nums, mid + 1, end, target);//如果target == nums[mid],继续向右查找
else return searchUpperBound(nums, start, mid, target);
}
};
注:保持编码风格的一致性,函数开始判断start==end,左边的范围是start到mid(而不是mid-1)