LeetCode 154寻找旋转排序数组中的最小值II
-
题目简述:假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组
[0,1,2,4,5,6,7]
可能变为[4,5,6,7,0,1,2]
)。请找出其中最小的元素。你可以假设数组中存在重复元素。 -
输入:[1, 3, 5] 输出:1
输入:[2, 2, 2, 0, 1, 1, 2] 输出:0
-
思路:有重复元素的排序数组旋转后,会分成两段有序序列,最小值前面的数
nums[i]
都满足nums[i] >= nums[0]并且nums[i] > nums[n-1]
,其中数组的最后一个元素nums[n-1]
有可能和开头元素相等,需要先将最后可能相等的元素删除,再使用二分。
class Solution {
public:
int findMin(vector<int>& nums) {
int l = 0, r = nums.size() - 1;
while(l < r && nums[l] == nums[r]) r--;
while(l < r)
{
int mid = l + r >> 1;
if(nums[mid] <= nums[r]) r = mid;
else l = mid + 1;
}
return nums[l];
}
};
- 写法二:边二分查找边删除
class Solution {
public:
int findMin(vector<int>& nums) {
int l = 0, r = nums.size() - 1;
while(l < r)
{
int mid = l + r >> 1;
if(nums[mid] < nums[r]) r = mid;
else if(nums[mid] > nums[r]) l = mid + 1;
else r--;
}
return nums[l];
}
};