class Solution {
// 首先确定这个pivot,然后在其左右分别进行搜索
private int binSearch(int lo,int hi,int[] nums,int target){
while(lo<=hi){
int mid=(lo+hi)/2;
if(nums[mid]<target){
lo=mid+1;
}else if(nums[mid]>target){
hi=mid-1;
}else{
return mid;
}
}
return -1;
}
public int search(int[] nums, int target) {
// 寻找pivot:这里定义为a[i]<a[i-1]中的i-1,然后分别在[0,i-1],[i,len-1]中搜索
int lo=0,hi=nums.length-1;
int pivot=-1;
while(lo<=hi){
int mid=(lo+hi)/2;
if(mid>=1&&nums[mid]<nums[mid-1]){
pivot=mid-1;
break;
}else if(nums[mid]>nums[0]){
// lo一定是左边一组,如果mid对应的更大,那么说明mid也在左边
lo=mid+1;
}else if(nums[mid]<nums[0]){
// 此时mid一定在右边一组
hi=mid-1;
}else if(nums[mid]==nums[0]){
pivot=0;
break;
}
}
int left=binSearch(0,pivot,nums,target);
int right=binSearch(pivot+1,nums.length-1,nums,target);
if(left!=-1){
return left;
}
if(right!=-1){
return right;
}
return -1;
}
}
思路很简单,但我发现我很难一次写正确...