class Solution {
public int search(int[] nums, int target) {
if(nums.length==0) return 0;
if(nums.length==1) return nums[0]==target?0:-1;
int left=0,right=nums.length-1;
while(left<=right){
int mid=(left+right)/2;
if(nums[mid]==target) return mid;
if(nums[0]<=nums[mid]){
if(nums[mid]>target&&nums[left]<=target) right=mid-1;
else left=mid+1;
}else{
if(nums[mid]<target&&nums[right]>=target) left=mid+1;
else right=mid-1;
}
}
return -1;
}
}
对于这种旋转过后的数组,首先要搞明白一点,当你找出mid时,mid的左右一定有一边是有序的,一边是存在旋转点的
while循环的每次目的是调整left或者right,以缩小寻找target的范围
如果我们通过nums[0]<nums[mid]判断出来是mid左边有序还是mid的右边有序,
接下来我们是不是可以判断target到底存不存在这个有序的这一边???
那么如果存在,把范围缩小在有序的这一边,不存在,就排除有序的这一边