给定一个按照升序排列的整数数组 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
与最右侧的target
,返回下标即可,没有找到就返回[-1,-1]
class Solution {
public int[] searchRange(int[] nums, int target) {
if(nums.length == 0)return new int[]{-1,-1};
//思路,两次二分,找到最左侧的target与最右侧的target
int l = 0, r = nums.length;
int mid = 0;
int ans1, ans2;
while (l < r) {//最左
mid = (r+l) >> 1;
if(nums[mid] == target){
r = mid;
}else if (nums[mid] > target){
r = mid;
}else if(nums[mid] < target){
l = mid + 1;
}
}
if(l == nums.length || nums[l] != target) ans1 = -1;
else ans1 = l;
l = 0;
r = nums.length;
while(l < r){//最右
mid = (l + r) >> 1;
if(nums[mid] == target){
l = mid + 1;
}else if(nums[mid] > target){
r = mid;
}else if(nums[mid] < target){
l = mid + 1;
}
}
if(l == 0 || nums[l - 1] != target)ans2 = -1;
else ans2 = l - 1;
return new int[]{ans1, ans2};
}
}