Follow up for "Find Minimum in Rotated Sorted Array":
What if duplicates are allowed?Would this affect the run-time complexity? How and why?
Suppose a sorted array 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
).
Find the minimum element.
The array may contain duplicates.
这道题目比“Find Minimum in Rotated Sorted Array”多了一个障碍条件,即允许出现重复数值。
重复数值的出现对二分查找来说是一个致命的打击,因为当我们用二分查找法,来判断是向左边查找还是右边查找的时候,若发现值都相等,就会不知所措了。对于AL == AM == AR这种情况,最小值既可能出现在AM的左边,也可能出现在AM的右边。此时我们就不能武断地任选一边,而只能把整个区间一个数一个数地逐渐缩小,即在这种情况下放弃二分查找。
我的C++代码如下:
class Solution {
public:
int findMin(vector<int>& nums) {
int iBegin = 0, iEnd = nums.size() - 1;
int iMid = 0;
//若数组为全局有序,则直接返回第一个元素即可
if(nums[0] < nums[iEnd])
return nums[0];
//若数组为部分有序
while(iBegin < iEnd)
{
if(nums[iBegin] < nums[iEnd])
break;
iMid = (iBegin + iEnd)>>1;
if(nums[iMid] > nums[iEnd])
iBegin = iMid + 1;
else if(nums[iMid] < nums[iEnd])
iEnd = iMid; //注意这里不是iMid-1,因为要保证最小值一定被包含在该区间中
else
iEnd--;//若值相等,则无法使用二分查找,故改用一个一个缩小区间的笨方法来做
}
return nums[iBegin];
}
};