34. Search for a Range
Given an array of integers sorted in ascending order, find the starting and ending position of a given target value.
Your algorithm’s runtime complexity must be in the order of O(log n).
If the target is not found in the array, return [-1, -1]
.
For example,
Given [5, 7, 7, 8, 8, 10]
and target value 8
,
return [3, 4]
.
方法
首先谨记一点时间复杂度为O(log n),只要是有限制的对log n,如2log n也属于O(log n)。
这样这道题就很简单了,做两次二分查找即可,第一次查target的第一个数,第二次查target的最后一个数,两次查找分别写两个方法。
如下是网上大神写的方法,思路也是查找两次,但是有优化。首先,查找target的第一个数,若第一个数都不是target,直接返回。第二次,在第一个target数的位置上向后再做二分查找,找到target的最后一个数。
public class Solution {
public int[] searchRange(int[] nums, int target) {
if(nums.length == 0){
return new int[]{-1,-1};
}
int start = 0;
int end = nums.length-1;
int[] res = new int[2];
res[0] = -1;
res[1] = -1;
while(start < end){
int mid = (start + end) / 2;
if(nums[mid] < target){
start = mid + 1;
}else{
end = mid;
}
}
if(nums[start] != target){
return res;
}
res[0] = start;
end = nums.length-1;
while(start < end){
int mid = (start + end) / 2 + 1;
if(nums[mid] > target){
end = mid - 1;
}else{
start = mid;
}
}
res[1] = end;
return res;
}
}