输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
找不到输出[-1,-1]
先找到第一个nums[mid]=target的mid,然后分别查找左右。
当时觉得还不错,一运行时间和线性查找差不多。
class Solution {
public int[] searchRange(int[] nums, int target) {
int left=0;
int right=nums.length-1;
int begin=left;
int end=right;
while (left<=right){
int mid=left+(right-left)/2;
if(nums[mid]==target){
if(mid-1>=0&&target>nums[mid-1]) begin=mid;
else begin=search(nums,target,left,mid-1,begin,0);
if(mid+1<nums.length&&target<nums[mid+1]) end=mid;
else end=search(nums,target,mid+1,right,end,1);
return new int[]{
begin,end};
}
if(nums[mid]>target) right=mid-1;
else left=mid+1;
}
return new int[]{
-1,-1};
}
private int search(int[] nums,int target,int left,int right,int tep,int f){
if(left>right) return tep;
while (left<=right){
int mid=left+(right-left)/2;
if(nums[mid]==target){
int te=search(nums,target,left,mid-1,mid,0);
int ta=search(nums,target,mid+1,right,mid,1);
if(f==0){
return Math.min(te,ta);
}else{
return Math.max(ta,te);
}
}
if(nums[mid]>target) right=mid-1;
else left=mid+1;
}
return tep;
}
}
下面这段代码十分的简介。二分,如果相等,那么看需求区间左移还是右移。
class Solution {
public int[] searchRange(int[] nums, int target) {
int begin=findLeft(nums,target);
int end=findRight(nums,target);
return new int[]{
begin,end};
}
private int findRight(int[] nums, int target) {
int ans=-1;
int left=0;
int right=nums.length-1;
while (left<=right){
int mid=left+((right-left)>>1);
if(nums[mid]==target){
ans=mid;
left=mid+1;
}else if(nums[mid]>target){
right=mid-1;
}else{
left=mid+1;
}
}
return ans;
}
private int findLeft(int[] nums,int target){
int ans=-1;
int left=0;
int right=nums.length-1;
while (left<=right){
int mid=left+((right-left)>>1);
if(nums[mid]==target){
ans=mid;
right=mid-1;
}else if(nums[mid]>target){
right=mid-1;
}else{
left=mid+1;
}
}
return ans;
}
}