Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., [0,0,1,2,2,5,6]
might become [2,5,6,0,0,1,2]
).
You are given a target value to search. If found in the array return true
, otherwise return false
.
Example 1:
Input: nums = [2,5,6,0,0,1,2]
, target = 0
Output: true
Example 2:
Input: nums = [2,5,6,0,0,1,2]
, target = 3
Output: false
Follow up:
- This is a follow up problem to Search in Rotated Sorted Array, where
nums
may contain duplicates. - Would this affect the run-time complexity? How and why?
解法:
Search in Rotated Sorted Array
参考这题的思路:
唯一不同的是,在判断哪边有序的时候,需要是小于等于。因为这里的数字是可以重复的,存在一种情况是右边所有的数字都相等。
class Solution {
public boolean search(int[] nums, int target) {
int len = nums.length;
//预处理
int left = 0;
int right = len-1;
while(left<right){
if(nums[left] == nums[right]){
right--;
if(right<len-1 && nums[right]!=nums[right+1])break;
}else{
break;
}
}
int mid = (left+right)/2;
while(left<=right){
if(nums[mid]==target)return true;
if(nums[mid]<=nums[right]){ // 小于等于,原因是全部数字相等的时候,右边也是有序的(3,1,2,2,2)找 1
//右边有序
if(target == nums[right])return true;
if(nums[mid]<target && target<nums[right]) left = mid+1;
else right = mid-1;
}else{
//左边有序
if(target == nums[left])return true;
if(nums[mid]>target && target>nums[left]) right = mid-1;
else left = mid+1;
}
mid = (left+right)/2; // 要更新参数
}
return false;
}
}