題目描述
Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed?
Would this affect the run-time complexity? How and why?
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7
might become 4 5 6 7 0 1 2
).
Write a function to determine if a given target is in the array.
The array may contain duplicates.
和之前的旋轉(zhuǎn)數(shù)組相比,如果增加重復(fù)元素這一限制,最終算法會有什么影響?如果旋轉(zhuǎn)數(shù)組里有指定的元素,則返回true,否則返回false
代碼及注釋
class Solution {
public:
int search(vector<int>& nums, int target) {
// 線性表搜索問題一般都會用到二分法
// 二分法涉及三個指針min max mid
int min = 0, max = nums.size()-1;
// 二分法最終的停止條件
while(min <= max){
// 初始第一次二分的mid
int mid = (min+max)/2;
// 如果mid恰好是target(最終target都會到mid這里)
if(nums[mid] == target) return true;
// 如果左半部分有序,則在此半部分(有序字符串)進(jìn)行二分查找
if(nums[min] < nums[mid]){
if(nums[min]<=target && target<nums[mid])
max = mid - 1;
else
min = mid + 1;
}else if(nums[min] > nums[mid]){
if(nums[mid]< target && target<=nums[max])
min = mid + 1;
else
max = mid - 1;
}else{
min++;
}
}
// 不滿足最高二分條件min<max時
return false;
}
};
分析
由于重復(fù)元素的存在,上一題判斷是否有序(遞增)的方式:nums[min] <= nums[mid] 不再成立。那么可以把之前的兩部分判斷分成三部分:
- nums[min]<nums[mid]:則[min,mid]遞增;
- nums[min]=nums[mid]:跳過,min++