Given an array of integers nums
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]
.
Example 1:
Input: nums = [5,7,7,8,8,10]
, target = 8
Output: [3,4]
Example 2:
Input: nums = [5,7,7,8,8,10]
, target = 6
Output: [-1,-1]
解法:左右边界发,调用两次二分法解决。难点还是在于边界条件的判断。
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] res = new int[2];
int len = nums.length;
int left = 0;
int right = len-1;
int resLeft = -1;
int resRight = -1;
while(left<=right){
int mid = (left+right)/2;
if(nums[mid] == target){
while(mid-1>=0 && nums[mid-1]==nums[mid])mid--; //mid-1大于等于0
resLeft = mid;
break; //break退出是精髓
}else if(nums[mid]>target){
right=mid-1;
}else{
left=mid+1;
}
}
left = 0;
right = len-1;
while(left<=right){
int mid = (left+right)/2;
if(nums[mid] == target){
while(mid+1<len && nums[mid+1]==nums[mid])mid++;
resRight = mid;
break;
}else if(nums[mid]>target){
right=mid-1;
}else{
left=mid+1;
}
}
res[0] = resLeft;
res[1] = resRight;
return res;
}
}