LeetCode34 在排序数组中查找元素的第一个和最后一个位置
题目描述
样例
算法分析
- 第一次二分找到 大于等于 target的最小值的位置,即查找元素的第一个位置a
-
开始位置,
mid>=target
-
第二次二分找到 小于等于 target的最大值的位置,即查找元素的最后一个位置b
- 最终位置,
mid<=target
时间复杂度$O(log(n))$
Java代码
class Solution {
public int[] searchRange(int[] nums, int target) {
if(nums.length == 0) return new int[]{-1, -1};
int n = nums.length;
int l = 0;
int r = n -1;
while(l < r){
int mid = l + r >> 1;
if(nums[mid] >= target ) r = mid;
else l = mid + 1;
}
int a = l;
l = 0;
r = n - 1;
while(l < r){
int mid = l + r + 1>> 1;
if(nums[mid] <= target) l = mid;
else r = mid - 1;
}
int b = l;
if(nums[a] != target || nums[b] != target) return new int[]{-1, -1};
return new int[]{a, b};
}
}