问题描述:
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].
在排序数组中搜索一个值有多少个,并返回其两边下标,没有找到就返回[-1,-1]。注意时间效率是O(longN)。
问题求解:
采用二分法,分别搜索左边界和右边界。
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int n=nums.size();
int start = Leftbound(nums, n, target);
int end = Rightbound(nums, n, target);
vector<int> res(2);
res[0] = start; res[1] = end;
return res;
}
int Leftbound(vector<int>& nums, int n, int target)
{//寻找左边界
if(n == 0) return -1;
int left = 0;
int right = n-1;
while(left < right)//!!!
{
int mid = left+(right-left)/2;
if(nums[mid] >= target) right = mid;
else left = mid+1;
}
if(nums[left] == target) return left;
else return -1;
}
int Rightbound(vector<int>& nums, int n, int target)
{//寻右边界
if(n == 0) return -1;
int left = 0;
int right = n-1;
while(left <= right)//!!!
{
int mid = left+(right-left)/2;
if(nums[mid] > target) right = mid-1; //!!!
else left = mid+1;
}
if(nums[right] == target) return right;
else return -1;
}
};