在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]
一开始的想法是二分法找到一个target,然后向两端遍历,但是这样最坏情况下时间复杂度是O(n)
于是改用两个二分法(用type0和1区分)查找最左端和最右端。
反复实践,加深了我对该章节三个二分法模板的理解。
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] res = {-1,-1};
if(nums.length==0){
return res;
}else{
res[0]=get(nums,target,0);
res[1]=get(nums,target,1);
}
return res;
}
private int get(int[] nums,int target,int type){
int l =0;
int r =nums.length -1;
while(l<r){
if(type == 0){
int mid = l+(r-l)/2;
if(nums[mid]<target){
l= mid+1;
}else{
r =mid;
}
}else{
int mid = l+(r-l)/2+1;
//这个加一是为了向上取整,防止陷入死循环
if(nums[mid]>target){
r= mid-1;
}else{
l =mid;
}
}
}
if(nums[l] ==target)return l;
if(nums[r] ==target)return r;
return -1;
}
}