81. 搜索旋转排序数组 II
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。
编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。
class Solution {
public boolean search(int[] nums, int target) {
//二分查找
int res = -1;
int first = 0;
int last = nums.length - 1;
int mid = first + (last - first)/2;
while(first <= last){
//判断是否找到target
if(nums[mid] == target){
return true;
}
//去除重复项
if(nums[first] == nums[mid] || nums[last] == nums[mid]){
first = nums[first] == nums[mid] ? first + 1 : first;
last = nums[last] == nums[mid] ? last - 1 : last;
}else{
//左边递增
//first<=target<mid,选左边
//其余,选右边
//右边递增
//mid<target<=last,选右边
//其余,选左边
if(nums[first] < nums[mid]){
if(nums[first]<=target && nums[mid] > target){
last = mid - 1;
}else{
first = mid + 1;
}
}else{
if(nums[mid] < nums[last]){
if(nums[mid]< target && nums[last] >= target){
first = mid + 1;
}else{
last = mid - 1;
}
}
}
}
mid = first + (last - first)/2;
}
return false;
}
}