Given a sorted array of integers, 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
return
[Thoughts]:我一开始没仔细看题,target 数组里面一定会有的,我一开始以为不一定会有Given
[5, 7, 7, 8, 8, 10] and target value 8,return
[3, 4].public class Solution {
public int[] searchRange(int[] A, int target) {
int[] res = new int[2];
Arrays.fill(res, -1);
search(res, A, target, 0, A.length-1);
return res;
}
public void search(int[] res, int[] A, int target, int start, int end){
if(start>end) return;
int mid = (start+end)/2;
if(A[mid]==target){
res[1] = mid>res[1] ? mid : res[1];
res[0] = (mid<res[0] || res[0]==-1) ? mid : res[0];
search(res, A, target, start, mid-1);
search(res, A, target, mid+1, end);
}else if(target<A[mid]){
search(res, A, target, start, mid-1);
}else{
search(res, A, target, mid+1, end);
}
}
}
上面的做法,最坏情况还是线性的,此题还有循环的做法:
public class Solution {
public int[] searchRange(int[] A, int target) {
int[] res = {-1, -1};
int l = 0, r = A.length-1;
while(l<r){//第一个循环找出最左端
int mid = (l+r)/2;
if(A[mid]<target)
l = mid+1;
else
r = mid;
}
if(A[l]==target)
res[0] = l;
else
return res;
l = 0; r = A.length-1;
while(l<r){//第二个循环找出最右端
int mid = (l+r)/2;
if(A[mid]<=target)
l = mid+1;
else
r = mid;
}
res[1] = A[l]==target ? l : l-1;
return res;
}
}