前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【手绘漫画】图解LeetCode之寻找旋转排序数组中的最小值 II(LeetCode154题)

【手绘漫画】图解LeetCode之寻找旋转排序数组中的最小值 II(LeetCode154题)

作者头像
我是管小亮
发布2020-04-20 17:17:10
2690
发布2020-04-20 17:17:10
举报

1、前言

手绘漫画系列正式上线!!!"图解LeetCode刷题计划" 来了!!!

今天是第二期,争取每天一期,最多两天一期,欢迎大家监督我。。。公众号监督最好!!!

今天要讲解的题目是LeetCode154题,昨天讲的,旋转的排序数组的进阶版。

【手绘漫画】图解LeetCode之寻找旋转排序数组中的最小值(LeetCode153题)

2、题目

首先看一下题目,

通过改变了一个条件,就让难度从【中等】变成了【困难】。

新增的条件是元素可以重复。

二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法。

3、正文

首先分析一下情况,和昨天的题相比,差别就在于数组元素是否有重复。

仔细想一下就会发现,重复与否其实不影响我们的二分法,只不过在 nums[mid] == nums[right] 时会有影响。

这里有个非常好的方法,就是 right--,下面简单分析一个例子:

可以看到方法可行。

4、代码

代码语言:javascript
复制
int findMin(int* nums, int numsSize){
    int left=0;int right=numsSize-1;
    while(right>left){
        int mid=left+(right-left)/2;
        if(nums[mid]>nums[right]){
            left=mid+1;
        }
        else if(nums[mid]<nums[right]){
            right=mid;
        }
        else{
            right--;
        }
    }
    return nums[left];
}

5、讨论

下面提一个问题,在执行 right-- 时,最小值是否会有丢失?

假设 nums[right] 是最小值,有两种情况:

  • nums[right] 一定不可能是唯一最小值,不然就无法满足判断条件 nums[mid] == nums[right] 了;
  • nums[right] 不是唯一最小值,即存在多个相同的最小值,由于 mid < right (昨天证明了)而 nums[mid] == nums[right],一定还有最小值存在于 [left, right - 1] 区间:
    • 或者存在 midmid 的右侧;
    • 或者存在 leftmid 的左侧,还有 right

故而没丢失。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员管小亮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档