1.题目如下:
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
示例 1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
示例 2:
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
示例 3:
输入:nums = [], target = 0
输出:[-1,-1]
提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109 nums 是一个非递减数组
-109 <= target <= 109
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.代码如下:
class Solution {
public:
/*思路,我这里用的是两个递归循环,通过两个不同的二分查找函数来得到左右的位置,两个函数的不同点在于:
*左边的函数是不断向左收敛的;
*右边的函数是不断向右收敛的,
*这样来确保我找到的左右的位置是边界。
*/
vector<int> searchRange(vector<int>& nums, int target) {
int i=0;
int j=nums.size()-1;
if(j==-1){
return vector<int>{-1,-1};
}
else{
return vector<int>{searchBinaryRange1(nums,i,j,target),searchBinaryRange2(nums,i,j,target)};
}
}
int searchBinaryRange1(vector<int>& nums, int i,int j,int target) {
int mid=(i+j)/2;
if(i==j){
if(nums[i]==target){
return i;
}
else{
return -1;
}
}
while(i<j){
if(nums[mid]==target){
return searchBinaryRange1(nums,i,mid,target);
}
else if(nums[mid]>target){
return searchBinaryRange1(nums,i,mid-1,target);
}
else{
return searchBinaryRange1(nums,mid+1,j,target);
}
}
return -1;
}
int searchBinaryRange2(vector<int>& nums, int i,int j,int target) {
//注意右边的边界应该是向右收敛的,所以这里与普通的二分定位mid不同
int mid=(i+j)%2==0?(i+j)/2:(i+j)/2+1;
if(i==j){
if(nums[i]==target){
return i;
}
else{
return -1;
}
}
while(i<j){
if(nums[mid]==target){
return searchBinaryRange2(nums,mid,j,target);
}
else if(nums[mid]>target){
return searchBinaryRange2(nums,i,mid-1,target);
}
else{
return searchBinaryRange2(nums,mid+1,j,target);
}
}
return -1;
}
};