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;
}
};

本文介绍了一种在已排序数组中寻找特定元素起始和结束位置的高效算法,该算法的时间复杂度为O(logn),并提供了两种实现方式:一种是通过分别寻找目标值的最左边界和最右边界;另一种是在单个函数中同时找到这两个位置。
289

被折叠的 条评论
为什么被折叠?



