原题
https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii/
思路
找到旋转位置k
确定target在k
的左边还是右边
对应左边或者右边进行二分查找
备注:本思路还有调优的空间,二分查找时相邻元素相同的问题!
题解
class Solution {
public boolean search(int[] nums, int target) {
int len = nums.length;
int k = 0;
// 1.先找到旋转的位置
for (k = 0; k < len-1; k++) {
if (nums[k] > nums[k+1]) {
break;
}
}
// 此时k就是旋转的位置
k++;
// 二分查找
// 数组本身非降序,直接二分查找
if (k == len) {
return bisectionSearch(nums, 0, len-1, target);
}
// 判断target可能在左半部分还是右半部分
// 左半部分
if (nums[0] <= target && target <= nums[k-1]) {
return bisectionSearch(nums, 0, k-1, target);
}
// 右半部分
if (nums[k] <= target && target <= nums[len-1]) {
return bisectionSearch(nums, k, len-1, target);
}
return false;
}
public static boolean bisectionSearch(int[] nums, int low, int high, int target){
while(low <= high){
int mid = (low+high)/2;
int cur = nums[mid];
if (cur < target) {
low = mid+1;
} else if (target < cur) {
high = mid-1;
} else {
return true;
}
}
return false;
}
}