题目描述:
给定一个按照升序排列的整数数组 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]
首先看我的code(不算复杂,只要想到所有可能结果就好了)
public int[] searchRange(int[] nums, int target) {
int len=nums.length;
if (len==1&&nums[0]==target)
return new int[]{0,0};
int start=-1,end=-1;
int i=0;
while (i<len){
if (nums[i]==target&&start==-1) {
start=end = i;
}else if (nums[i]==target&&start!=-1){
end=i;
}
i++;
}
return new int[]{start,end};
}
二分
public int[] searchRange(int[] nums, int target) {
int[] targetRange={-1,-1};
int leftIdx=extremeInsertionIndex(nums,target,true);
if (leftIdx==nums.length||nums[leftIdx]!=target){
return targetRange;
}
targetRange[0]=leftIdx;
targetRange[1]=extremeInsertionIndex(nums,target,false)-1;
return targetRange;
}
private int extremeInsertionIndex(int[] nums, int target, boolean left) {
int lo=0;
int hi=nums.length;
while (lo<hi){
int mid=(lo+hi)/2;
if (nums[mid]>target||(left&&target==nums[mid])){
hi=mid;
}else {
lo=mid+1;
}
}
return lo;
}