LeetCode.154 - 寻找旋转排序数组中的最小值 II(二分思想)

154. 寻找旋转排序数组中的最小值 II
在这里插入图片描述

方法一:暴力解法

这个十分暴力,就是依次去遍历,然后元素之间比较大小。时间复杂度O(N),代码简单。

方法二:二分思想

利用二分的思想可以加速查找,因为二分每次判断都会丢弃一般的数据量。虽然这个数组不是有序的,但是部分有序的。

可以由于题目的特性
可能会出现,[0,n/2+a]区间都是升序的(a∈[−n/2,n/2])。
理解一下就是左半边区间是可能是有序的,也可能是右半区间是有序的。所以,我们可以考虑使用mid=(left+right)>>1来判断。
对于二分算法而言,有三种情况

  1. 如果出现了v[left]<v[right]的情况,那么这个说明着个区间是有序的,最小值就是v[left]
  2. v[mid]在v[right]前面,如果v[mid]大于v[right],那么可以得知,最小值在一定在[mid-1,right]区间中
  3. 如果v[mid]<v[right],说明最小值在[left,mid]区间中,mid也可能是最小值。
  4. 如果v[mid]=v[right],那么,说明这个数组出现了未知情况,就可以考虑暴力缩减其区间长度,不然根本就没有判断的依据,只能贪心思想。

这个区间的目的就是将最小值圈在区间内,保证最小值一定在[left,right]的区间内

将数组数形相结合,大概就这几种情况
在这里插入图片描述
对这些模型进行分析,都被包含在了四种判断条件的范围内。
代码实现

class Solution {
public:
    int findMin(vector<int>& nums) {
        int left=0;
        int right=nums.size()-1;
        while(left<right)
        {
            if(nums[left]<nums[right])//有序的区间
                return nums[left];
            int mid=(left+right)>>1;
            if(nums[mid]<nums[right])
                right=mid;
            else if(nums[mid]>nums[right])
                left=mid+1;
            else//贪心,暴力缩减区间长度
                left++;
        }
        return nums[left];
    }
};

感谢各位大佬观看

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值