给一个旋转数组,找出要的数字。
是一个二分查找的变种,每次变换数组后有数组两种可能性,一种是array[mid]比array[left]大,另一种是比他小;如果大的话判断是否在左边,直接用二分法,如果不是接着循环判断;比他小的情况类似。
注意点:边界值,array[mid]>=array[left]中的等号,另一个是target >= array[left]中的等号
public static int search(int[] array, int target) {
int len = array.length;
int left = 0, right = len - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (array[mid] == target) {
return 1;
}
if (array[mid] >= array[left]) {
if (target < array[mid] && target >= array[left]) {
// 此时target进入左边的递增数组,可以直接用二分法
right = mid - 1;
} else {
// 此时在右边的数组中继续循环
left = mid + 1;
}
} else {
if (target > array[mid] && target <= array[right]) {
// 此时target进入右边的递增数组,可以直接用二分法
left = mid + 1;
} else {
// 此时在左边的数组中继续循环判断
right = mid - 1;
}
}
}
return 0;
}