这个题我十天前刚做过,脑子里只蹦出了二分法。
然后没了。
这道题两种方法,第一种稍微麻烦
1.用之前二分法的题寻找旋转数组的最小值(中间值和右边界值比较)
2.判断待查找的值在最小值的左还是右,然后对所在的区间再来一次二分法。
第二种其实和第一种含义是一样的,不断寻找目标值的区间,在中间值的左还是右
1、中间值和右边界比较,若右边界比中间值大,代表中间值右边有序。若右边界比中间值小。代表左边有序。
2、目标值和有序区间对比,看是否在有序区间内,在的话,在这个区间继续这样二分。若是不在的话,在另一个区间这样二分。
这里有几个等号忘记加,一个是判断左右边界和目标值是否相同时要加,因为左右边界也可以等于。
而是while循环条件中。因为返回值在里边。
public int search(int[] nums, int target) {
int left=0,right=nums.length-1;
while(left<=right){
int mid =(left+right)/2;
if(nums[mid]==target)return mid;
if(nums[mid]>nums[right]){
if(target<nums[mid]&&target>=nums[left]){
right=mid-1;
}else{
left=mid+1;
}
}else {
if(target>nums[mid]&&target<=nums[right]){
left=mid+1;
}else{
right=mid-1;
}
}
}
return -1;
}