public static int searchHelper(int[] arr, int left, int right) {
if (left > right) {
return -1;
}
int mid = left + (right - left) / 2;
// 正常顺序, 一直找到左端
if (mid == 0) {
// 特殊情况, 只rotate一次,例如 5,1,2,3,4
if (arr.length > 1 && arr[mid] > arr[mid + 1]) return 1;
return 0;
}
// 逆序, 一直找到右端
if (mid == arr.length - 1) {
return arr.length;
}
// 找到 rotate 点的条件
if (arr[mid] > arr[mid + 1] && arr[mid] >= arr[mid - 1]) {
return mid + 1;
}
// 右边顺序正常,到左边找
if (arr[mid] < arr[right]) {
return searchHelper(arr, left, mid - 1);
// 右边顺序不正常,到右边找
} else if (arr[mid] > arr[right]) {
return searchHelper(arr, mid + 1, right);
// 特殊情况, 有 duplicate, 左右判断不出来,例如 {2,2,2,2,1,2,2}, 左右都找
} else {
int searchLeftResult = searchHelper(arr, left, mid - 1);
int searchRightResult = searchHelper(arr, mid + 1, right);
if (searchLeftResult == -1 && searchRightResult == -1) return -1;
if (searchLeftResult != -1) return searchLeftResult;
if (searchRightResult != -1) return searchRightResult;
return -1;
}
}
public static int searchRotatePosition(int[] arr) {
return searchHelper(arr, 0, arr.length - 1);
}
几个 test case:
A0 = {3,4,5,6,7,8,1,2}
A1 = {1,2,3,4,5,6,7}
A2 = {7,6,5,4,3,2,1}
A3 = {5,1,1,1,2,3,4}
A4 = {2,2,3,4,1,2,2}
A5 = {2,2,2,2,1,2,2}