这道题是在旋转过的有序数组中寻找最小值的扩展,不同的是有重复的数字。
上一个题寻找最小,利用二分查找的方法。比较nums[mid]和nums[end],如果mid位置比较大,说明最小的数在mid~end。如果mid位置比较小,说明最小的数在start~mid。
这道题应该先自己写出几个例子来看一下,有重复数字会出现什么现象。例如:
222222220112还有222022222222.从这两个例子可以看出,有可能造成nums[mid]等于nums[end]的现象,这样没办法知道最小值是在前半部分还是后半部分。这时候要两边都计算一下,取最小就可以了。
class Solution {
public:
int findMin(vector<int>& nums) {
return helper(nums, 0, nums.size()-1);
}
int helper(vector<int>& nums, int start, int end){
if(end - start <= 1)
return min(nums[start], nums[end]);
int mid = (start + end)/2;
if(nums[mid] < nums[end])
return helper(nums, start, mid);
else if(nums[mid] > nums[end])
return helper(nums, mid, end);
else{
return min(helper(nums, start, mid), helper(nums, mid, end));
}
}
};