34. Find First and Last Position of Element in Sorted Array
Medium
141677FavoriteShare
Given an array of integers nums
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]
.
Example 1:
Input: nums = [5,7,7,8,8,10]
, target = 8
Output: [3,4]
Example 2:
Input: nums = [5,7,7,8,8,10]
, target = 6
Output: [-1,-1]
看到时间复杂度是logn,那这道题一定是用二分法。我原来是想用两次二分法,先找到这个数的左边,再找到右边,但是这样有些问题。后来参考了网上的做法,先用二分法找到这个数,然后再往左右找。
下面是AC的代码:
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> ans;
ans.clear();
if(nums.size()==0)
{
ans.push_back(-1);
ans.push_back(-1);
return ans;
}
if(nums.size()==1)
{
if(nums[0]==target)
{
ans.push_back(0);
ans.push_back(0);
return ans;
}
else
{
ans.push_back(-1);
ans.push_back(-1);
return ans;
}
}
int L=0;
int R=nums.size()-1;
int mid;
while(L<R)
{
mid=L+(R-L)/2;
if(nums[mid]<target)L=mid+1;
else R=mid;
}
if(nums[L]!=target)
{
ans.push_back(-1);
ans.push_back(-1);
return ans;
}
else
{
int A=L;
int B=L;
while(A>=0&&nums[A]==target)
{
A--;
}
while(B<=(nums.size()-1)&&nums[B]==target)
{
B++;
}
ans.push_back(A+1);
ans.push_back(B-1);
return ans;
}
}
};