二分查找:
class Solution {
// 拿旋转后的第一个数判断目标值在 “大一点”的序列中 还是 “小一点”的序列中
// 如果在 “大一点”的序列中 以right = 0 为基准,
// 若 nums[mid] > nums[right] 说明 mid 在正确区域里 这时候就可以二分查找了
// 反之说明mid不在正确区域 就要缩小left值
// 如果在 “小一点”的序列中 以left = n - 1 为基准,
// nums[mid] > nums[left] 说明mid不在正确区域
// 反之说明 mid 在正确区域里 这时候就可以二分查找了
// 最终没找到就返回-1
public int search(int[] nums, int target) {
int n = nums.length;
int t = nums[0];
if (target == t) {
return 0;
}
int right = 0;
int left = n - 1;
if (target > t) {
while (right <= left) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid;
}
if (nums[mid] > nums[right]) {
if (target > nums[mid]) {
right = mid + 1;
} else {
left = mid - 1;
}
} else {
left = mid - 1;
}
}
}
if (target < t) {
while (right <= left) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid;
}
if (nums[mid] > nums[left]) {
right = mid + 1;
} else {
if (nums[mid] > target) {
left = mid - 1;
} else {
right = mid + 1;
}
}
}
}
return -1;
}
}