// 题意要求log(n),毋庸置疑二分查找,直接写二分逻辑没理清楚,所以
// 另辟蹊径.
// 由于旋转后一定是前段有序,中间断开,后段有序,并且前段都比后段大
// 则可以通过二分查找先找到前段与后段断开处的下标,再在两端分别进
// 行二分查找即可.
// 注意二分的区间,两端的开闭情况,容易死循环
class Solution {
public int search(int[] nums, int target) {
int n = nums.length;
if (n == 0)
return -1;
int index = rotateIndex(nums, nums[n - 1]);
int left = binariSearch(nums, 0, index, target);
// System.out.println(index);
if (left != -1)
return left;
int right = binariSearch(nums, index + 1, n - 1, target);
if (right != -1)
return right;
return -1;
}
public int binariSearch(int[] nums, int l, int r, int target) {
int mid = 0;
while (l < r) { // 左闭右闭
mid = (l + r) / 2;
if (nums[mid] < target) {
l = mid + 1;
} else {
r = mid;
}
}
if (target == nums[r])
return r;
else
return -1;
}
public int rotateIndex(int[] nums, int target) {
int l = 0;
int r = nums.length - 1;
int mid = 0;
while (l + 1 < r) { // 左闭右开
mid = (l + r) / 2;
// System.out.println(l + " " + r + " " + mid + " " + nums[mid] + " " + target);
if (nums[mid] > target)
l = mid;
else
r = mid;
}
return l;
}
}