在排序数组中查找元素的第一个和最后一个位置
题目链接
给你一个按照非递减顺序排列的整数数组 nums
,和一个目标值 target
。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target
,返回 [-1, -1]
。
你必须设计并实现时间复杂度为 O(logn) 的算法解决此问题。
示例 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 <=
1
0
5
10^5
105
−
1
0
9
-10^9
−109 <= nums[i] <=
1
0
9
10^9
109
nums 是一个非递减数组
−
1
0
9
-10^9
−109 <= target <=
1
0
9
10^9
109
解题思路
- 二分算法
- 本题需要对传统的二分算法进行魔改
- 改动之处主要在于当
nums[mid]==target
时,如何处理。- 当我们查找左边界时,令r=mid-1即可。
- 当我们查找右边界时,令l=mid+1即可。
- 此外还要开一个变量x记录mid的位置,返回结果时候需要用到。
- 细节见代码,代码也不多。
解题代码
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
vector<int>ans;
vector<int> searchRange(vector<int>& nums, int target) {
int l=0;
int r=nums.size()-1;
int l1=-1;
while(l<=r){
int m = (l+r)>>1;
if(nums[m]<target)l=m+1;
if(nums[m]>target)r=m-1;
if(nums[m]==target){
r=m-1;
l1=m;
}
}
l=0;
r=nums.size()-1;
int r1=-1;
while(l<=r){
int m = (l+r)>>1;
if(nums[m]<target)l=m+1;
if(nums[m]>target)r=m-1;
if(nums[m]==target){
l=m+1;
r1=m;
}
}
ans.push_back(l1);
ans.push_back(r1);
return ans;
}
};
int main(){
vector<int>nums = {1,2,2};
int target = 1;
Solution so = Solution();
so.searchRange(nums,target);
return 0;
}