给你一个按照非递减顺序排列的整数数组
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
不管,二分先找到target下标
找到下标在找边界
class Solution {
public:
int erfs(vector<int>& nums, int left, int right, int target) {
if (left == right) {
return nums[left] == target ? left : -1;
}
if (left + 1 == right) {
int k = -1;
if (nums[left] == target) k = left;
if (nums[right] == target) k = right;
return k;
}
int mid = (left + right) / 2, res;
if (target > nums[mid]) res = erfs(nums, mid, right, target);
else res = erfs(nums, left, mid, target);
return res;
}
vector<int> searchRange(vector<int>& nums, int target) {
if(nums.size() == 0) return vector<int> {-1, -1};
int idx = erfs(nums, 0, nums.size() - 1, target);
vector<int> res = {idx, idx};
if(idx != -1){
while(res[0] >=0 && nums[res[0]] == target) res[0]--;
res[0]++;
while(res[1] < nums.size() && nums[res[1]] == target) res[1]++;
res[1]--;
}
return res;
}
};