https://leetcode.com/problems/search-in-rotated-sorted-array/
最开始想到的是找到rotation的位置pos,然后对前和后的sorted array分别进行二分查找。可惜这种方法找到pos的位置的时间复杂度是o(n),不符合要求。
只有使用二分法才能达到题目要求的O(logN)的时间复杂度。
考虑到一个rotation之后的array,找到mid,则对于mid分成的三部分,即为start , mid , end. 必然有一部分为排序号的array,另外的一个是rotated 之后的array。
这样我们就可以通过对比 mid所在的值,找到应该在左边(nums[left] – nums[mid])中去找,还是在(nums[mid] – nums[end])去查找。
所以对应的代码如下:
public int search(int[] nums, int target) {
int start = 0, end = nums.length - 1;
while (start <= end) {
int mid = start + (end - start) / 2;
if (nums[mid] == target) return mid;
// 左边是sorted array, 右边是rotated array
// 4,5,6 | 7 |, 1, 2 3
if (nums[start] > nums[mid]) {
if (nums[mid] < target && nums[end] >= target) {
start = mid + 1;
} else end = mid - 1;
} else {
// 左边是rotated array,右边是sorted array 例如: 4,5,0 | 1 |, 2, 3 3
// 落在左边的范围内
if (nums[mid] > target && nums[start] <= target) {
end = mid - 1;
} else start = mid + 1;
}
}
return -1;
}