假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。
编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。
虽然是旋转过的,但该数组仍然是由两个有序数组组成的,因此还是可以使用二分法,只不过二分法要判断在哪个区间内使用。通过观察我得到的规律是,以旋转点为界,两边是两个不同的有序数组,然后判断目标值与第二个数组末尾值的大小,来选择在哪个区间上二分查找。
class Solution {
boolean binarysearch(int []nums,int left,int right,int target){
boolean flag = false;
while(left<=right){
int mid = (left+right)/2;
if(target>nums[mid]){
left = mid+1;
}
else if(target<nums[mid]){
right = mid-1;
}
else if(target == nums[mid]){
flag = true;
break;
}
}
return flag;
}
public boolean search(int[] nums, int target) {
boolean flag = false;
if(target == nums[nums.length-1]){return true;}
int left = 0;
int right = 0;
for(int i = 0;i < nums.length-1;i++){
if(nums[i]>nums[i+1]){
left = i;
right = i+1;
}
}
if(target>nums[nums.length-1]){flag = binarysearch(nums,0,left,target);}
else{flag = binarysearch(nums,right,nums.length,target);}
return flag;
}
}