使用二分查找解题
class Solution {
/**
先找到非单调的分界点,
然后在各自段进行二分查找
*/
public int search(int[] nums, int target) {
//4 5 6 7 0 1 2
// 二分找到分界点0,然后在每段再各自二分
int n = nums.length;
int left = 0;
int right = n - 1;
while (left < right) {
int mid = (left + right) / 2; // 0
// 如果二分点恰好是目标值,直接返回
if (nums[mid] == target) return mid;
if (nums[mid] <= nums[n - 1]) {
right = mid; // 0
} else {
left = mid + 1;
}
}
if (nums[right] == target) {
return right;
} else if (nums[right] < target && target <= nums[n - 1]) {
// 在右半段
return binarySearch(nums, right + 1, n - 1, target);
} else {
return binarySearch(nums, 0, right - 1, target);
}
}
// 起始 结束
public int binarySearch(int[] nums, int start, int end, int target) {
int left = start;
int right = end;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] == target) {
return mid;
}
if (nums[mid] < target) { // 在右边
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
}