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?
这道题跟33. Search in Rotated Sorted Array不同之处在于,现在多了重复的元素,所以有可能出现的情况是首尾和中间元素相同,这时就要移动首尾指针,直到首尾和中间的元素不相同,再去判断哪边是升序哪边是降序。
代码:
class Solution {
public:
bool search(vector<int>& nums, int target) {
int left = 0,right=nums.size()-1,mid=0;
while(left<=right){
mid = (left+right)/2;
if(target==nums[mid]) return true;
if(nums[left]==nums[mid]&&nums[right]==nums[mid]) {left++;right--;}
else if(nums[left]<=nums[mid]){
if(target>=nums[left]&&target<nums[mid]) right = mid-1;
else left = mid+1;
}
else{
if(target>nums[mid]&&target<=nums[right]) left = mid+1;
else right = mid-1;
}
}
return false;
}
};