Find First and Last Position of Element in Sorted Array
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]
解析
在排序数组中找一个数的范围,即左边界和右边界。
定义两个找最左边界和最右边界的函数,在左边界中,如果找到mid == target,判断mid==0 或者mid前一个是否等于target,如果不等于,则找到,如果等于,则继续二分查找
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int left = GetfirstK(nums, target);
int right = GetlastK(nums, target);
vector<int> res;
res.push_back(left);
res.push_back(right);
return res;
}
int GetfirstK(vector<int>& nums, int target){
int left = 0,right = nums.size()-1;
while(left<=right){
int mid = (left+right)>>1;
if(nums[mid] == target){
if(mid == 0 || (mid>0 && nums[mid-1] != target))
return mid;
else
right = mid-1;
}
else if(nums[mid] > target)
right = mid-1;
else
left = mid+1;
}
return -1;
}
int GetlastK(vector<int>& nums, int target){
int size = nums.size();
int left = 0,right = nums.size()-1;
while(left<=right){
int mid = (left+right)>>1;
if(nums[mid] == target){
if(mid == size-1 || (mid <size-1 && nums[mid+1] != target))
return mid;
else
left = mid+1;
}
else if(nums[mid] > target)
right = mid-1;
else
left = mid+1;
}
return -1;
}
};
也可以在一个函数中找到两个值,具体参考
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> res(2, -1);
int left = 0, right = nums.size() - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] < target) left = mid + 1;
else right = mid;
}
if (nums[right] != target) return res;
res[0] = right;
right = nums.size();
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] <= target) left = mid + 1;
else right= mid;
}
res[1] = left - 1;
return res;
}
};