34. Search for a Range
- Total Accepted: 130169
- Total Submissions: 418001
- Difficulty: Medium
- Contributor: LeetCode
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]
.
解题思路:这道题主要是一个查找的问题,因为要求用时log(n),所以我选择了二分查找的方法,首先找到target的一个位置,那么所有的target必然在
这个位置的左边或者右边,然后用两个循环分别向两边搜索就可以找到target的位置范围。
解答:
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> ret;
int low = 0;
int high = nums.size() -1;
int mid = 0;
bool is = false;
while(low <= high){
mid = (low + high) / 2;
if(nums[mid] == target){
is = true;
break;
}
else if(nums[mid] < target ){
low = mid +1;
}
else{
high = mid - 1;
}
}
if(is){
int q = mid - 1;
int w = mid + 1;
while(q >= 0 &&nums[q] == target){
q --;
}
q = q + 1;
while(w < nums.size() && nums[w] == target){
w ++;
}
w = w - 1;
ret.push_back(q);
ret.push_back(w);
return ret;
}
else{
ret.push_back(-1);
ret.push_back(-1);
return ret;
}
}
};