問題描述
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 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
).
Find the minimum element.
The array may contain duplicates.
解題思路
用二分查找的思路,因爲在某個下標處前後兩段Array對換,因此對換後的Array首元素必定比末尾元素要大。基於此可以判斷Array中間元素與首元素的大小關係。假設首元素下標爲start,末尾元素下標爲end,中間元素下標爲mid。
二分查找的while循環的判斷條件爲start<end 和 nums[start]>=nums[end];因爲存在值相等的元素,因此如果簡單的判斷nums[start]>nums[end]則會出現對下一步的start和end邊界判斷錯誤的情況(如測例爲[3,3,1,3])。
將nums[mid]與nums[start]比較,若nums[mid]>nums[start],則說明最小值處於[mid+1,end]區間;若nums[mid]==nums[start],則將start向後推一個下標;若nums[mid]<nums[start],則說明最小值處於[start,mid]區間。
代碼如下:
class Solution {
public:
int findMin(vector<int>& nums) {
if (nums.empty()) return 0;
if (nums.size() == 1) return nums[0];
int leng = nums.size();
int start = 0, end = leng - 1;
int mid;
while (start < end && nums[start] >= nums[end]) {
mid = (start + end) / 2;
if (nums[mid] < nums[start]) {
end = mid;
}
else if (nums[mid] == nums[start]) {
start++;
}
else if (nums[mid] > nums[start]) {
start = mid + 1;
}
}
return nums[start];
}
};