旋转有序数组:将一个有序数组,把某个元素之后的元素旋转到第一个元素的前面
例如:1234567将4之后的元素旋转后得到旋转有序数组:5671234;1111113将第2个元素之后的元素旋转得到:1111311
思路:与二分法的思路类似
设left和right,求出middle;首先,【left,middle】和【middle,right】中肯定有一段是有序数列。
如果middle == target,则找到该数,返回true;
如果left<middle,说明左半部分是有序的:如果left<=target && target <middle,说明该数在左半部分,则right=middle-1,否则该数在右半部分,则left=middle+1;
如果middle<right,说明右半部分是有序的:如果middle<target && target <=right,说明该数在右半部分,则left=middle+1,否则该数在左半部分,则right=middle-1;
如果left==middle,则left++;
如果right==middle,则right--;
public boolean search(int[] A, int target) {
int left = 0;
int right = A.length-1;
int mid = 0;
while(left <= right){
int leftv = A[left];
int rightv = A[right];
mid = (left+right)/2;
int midv = A[mid];
if(midv == target){
return true;
}
if(leftv < midv){
if(leftv <= target && target < midv){
right = mid-1;
}else{
left = mid+1;
}
}else if(midv < rightv){
if(midv < target && target <= rightv){
left = mid+1;
}else{
right = mid-1;
}
}else if(leftv == midv){
left++;
}else if(midv == rightv){
right--;
}
}
return false;
}