问题描述
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]; } };