解题思路:
旋转排序数组可分为N1 + N2两个部分,如:[4,5,6,7,1,2,3],N1为[4,5,6,7],N2为[1,2,3]
必然满足以下两个条件:
1. N1和N2都是分别递增的;
2. N1中的所有元素大于N2中的所有元素;
以上两个条件可推出:nums[0]是N1中最小的数,即nums[0] > N2中的所有元素
而mid不是在N1内就是在N2内
所以:如果nums[0] <= nums[mid],即mid落在了N1内,则[0, mid]肯定是有序的
否则mid落在了N2内,则[mid, n)肯定是有序的
if (nums[0] <= nums[mid]) {
// 左半边有序
} else {
// 右半边有序
}
class Solution {
public int search(int[] nums, int target) {
int n = nums.length;
if (n == 0) return -1;
if (n == 1) return nums[0] == target ? 0 : -1;
int l = 0, r = n - 1;
while (l <= r) {
int mid = l + (r - l) / 2;
if (nums[mid] == target) {
return mid;
}
if (nums[0] > nums[mid]) {
if (nums[mid] < target && target <= nums[n - 1]) {
l = mid + 1;
} else
r = mid - 1;
} else {
if (nums[0] <= target && target < nums[mid]) {
r = mid - 1;
} else
l = mid + 1;
}
}
return -1;
}
}