美文网首页
2019-08-04 EP154 Find Minimum in

2019-08-04 EP154 Find Minimum in

作者: ShadowTuDark | 来源:发表于2019-08-04 15:00 被阅读0次
    image.png

    这个题是二分查找的典型题目,递归非递归都可以解决这个问题,首先我们用递归的额方式来看看,需要说明的是,递归本身用的栈一般不算在空间复杂度上。

    递归求解:

    class Solution {
    public:
        int findMin(vector<int>& nums) {
            return findMinHelper(nums, 0, nums.size() - 1);
        }
        
        int findMinHelper(vector<int>& nums, int begin, int end) {
            if (begin == end) return nums[begin];
            
            if (end - begin == 1) return nums[end] > nums[begin] ? nums[begin] : nums[end];
            
            if (nums[begin] < nums[end]) return nums[begin]; 
            
            if (nums[begin] == nums[end]) {
                int val = nums[begin];
                while (begin < end) {
                    val = min(val, nums[begin]);
                    begin++;
                }
                
                return val;
            }
            
            int mid = (end - begin) / 2 + begin;
            
            return min(findMinHelper(nums, 0, mid), findMinHelper(nums, mid + 1, end));
        }
    };
    

    非递归求解,分三步,

    1. 如果 nums[m] 小于 nums[r] 说明最小值肯定不在右侧,肯定在左侧
    2. 如果 nums[m] 大于 nums[r] 说明最小值肯定不在左侧,在右侧
    3. 如果相等说明没有办法判断,那么只能一步一步来缩小范围,r--来操作
    class Solution {
    public:
        int findMin(vector<int>& nums) {
            int l = 0, r = nums.size()-1;
            while(l < r){
                int m = l+((r-l)>>1);
                if(nums[m] < nums[r]) r = m;
                else if(nums[m] > nums[r]) l = m+1;
                else r--;
            }
            return nums[l];
        }
    };
    

    相关文章

      网友评论

          本文标题:2019-08-04 EP154 Find Minimum in

          本文链接:https://www.haomeiwen.com/subject/pbhydctx.html