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.
Example 1:
Input: [1,3,5] Output: 1
Example 2:
Input: [2,2,2,0,1] Output: 0
Note:
- This is a follow up problem to Find Minimum in Rotated Sorted Array.
- Would allow duplicates affect the run-time complexity? How and why?
思路:
出现了重复数字会影响我们程序的走向,为了继续使用序列的顺序性,我们可将重复的数字删除一部分,当然这样的话最坏情况时间复杂度会变为O(n)。
1 暴力求解
扫描二维码关注公众号,回复:
5430359 查看本文章
int findMin(vector<int>& nums) {
int res = INT_MAX;
for (auto i : nums) res = min(res, i);
return res;
}
2 二分法
int findMin2(vector<int> &nums){
if (nums.size() == 1) return nums[0];
if (nums.size() == 2) return min(nums[0], nums[1]);
decltype(nums.size()) left = 0;
decltype(nums.size()) right = nums.size() - 1;
decltype(nums.size()) mid = (left + right) / 2;
while (right - left >= 2){
while (right - left >= 2 && nums[left] == nums[right]) right--;
if (right - left < 2) break;
mid = (left + right) / 2;
if (nums[mid - 1] > nums[mid] && nums[mid + 1] > nums[mid]) return nums[mid];
if (nums[mid] >= nums[left] && nums[left] >= nums[right]){
left = mid;
mid = (left + right) / 2;
}
else{
right = mid;
mid = (left + right) / 2;
}
}
return min(nums[left], nums[right]);
}