154. Find Minimum in Rotated Sorted Array II

来源:互联网 发布:什么是淘宝直通车? 编辑:程序博客网 时间:2024/06/03 20:34

这道题是在旋转过的有序数组中寻找最小值的扩展,不同的是有重复的数字。

上一个题寻找最小,利用二分查找的方法。比较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));        }    }};


原创粉丝点击