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;
}
}
思路很简单,但我发现我很难一次写正确...
该博客介绍了如何优化二分查找算法,通过寻找数组中的转折点(pivot),将数组分为两部分,并分别在两部分中进行目标值的搜索。在寻找pivot的过程中,使用了中间值与前一个值的比较,确保了pivot的正确位置。这种方法提高了搜索效率,减少了无效的查找次数。
820

被折叠的 条评论
为什么被折叠?



