搜索旋转排序数组 II
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。
编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。
改进二分搜索
注意重复数字、所有边界的处理
/*
//每次二分,左半部分和右半部分至少有一边是有序的,以此为条件可以分成两种情况:
//1、左半边是有序的
//(1) target落在左半边
//(2) otherwise
//2、右半边是有序的
//(1) target落在右半边
//(2) otherwise
//综上所述,一共两种可能性,这两种情况各自又有两种可能性,代码如下:
*/
class Solution {
public boolean search(int[] nums, int target) {
if(nums == null || nums.length == 0) {
return false;
}
int n = nums.length;
if(n == 1) {
return nums[0] == target ? true : false;
}
int left = 0;
int right = n - 1;
while(left <= right) {
//注意先处理数组中的重复元素,收缩边界
while(left < right && nums[left] == nums[left + 1]) {
left++;
}
while(left < right && nums[right] == nums[right - 1]) {
right--;
}
int mid = left + (right - left) / 2;
if(nums[mid] == target) {
return true;
}
//1.left~mid是有序的
if(nums[left] <= nums[mid]) {
if(nums[left] <= target && target < nums[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
} else {
//2. mid~right有序
if(nums[mid] < target && target <= nums[right]) {
left = mid + 1;
} else {
right = mid - 1;
}
}
}
return false;
}
}