leetcode题目链接: 34.在排序数组中查找元素的第一个和最后一个位置
题目描述:
解法:二分法
三种常用的二分法模板分析
因为数组元素是有序的,利用二分查找可以做到Olog(n)的时间复杂度。
- 查找 >= target (开始位置)
- 查找 target + 1(结束位置)
代码:
class Solution {
public int[] searchRange(int[] nums, int target) {
int right = nums.length ;
int first = find(nums, 0, right, target);//开始位置
int second = find(nums, 0, right, target + 1);//结束位置
//没有找到 target
if(first == nums.length || nums[first] != target){
return new int[]{-1,-1};
}
return new int[]{first, second - 1};
}
//二分查找模板二
int find(int[] nums, int left, int right, int target){
while(left < right){
int mid = (left + right) >> 1;
if(nums[mid] < target){
left = mid + 1;
} else {
right = mid;
}
}
return left;
}
}