Given an array of integers sorted in ascending order, 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]
.
法一:
类似使用二分法,分别找出target的起始和终点
https://leetcode.com/problems/search-for-a-range/discuss/
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> ind(2, -1);
if(nums.capacity() == 0) return ind;
int l = 0, r = nums.capacity() - 1;
while(r > l){ //寻找左边缘
int m = (r + l)/2;
if(nums[m] < target) l = m + 1;
else r = m;
}
if(nums[l] != target) return ind;
ind[0] = l;
r = nums.capacity() - 1;
while(r > l){ //寻找右边缘
int m = (r + l)/2 + 1; //加一使m更接近右边缘
if(nums[m] > target) r = m - 1;
else l = m;
}
ind[1] = r;
return ind;
}
};
法二:
使用函数库:
vector<int> searchRange(vector<int>& nums, int target) {
auto bounds = equal_range(nums.begin(), nums.end(), target);
if (bounds.first == bounds.second)
return {-1, -1};
return {bounds.first - nums.begin(), bounds.second - nums.begin() - 1};
}