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

在这里插入图片描述

图解LeetCode刷题计划

1、写在前面

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

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

在这里插入图片描述
今天要讲解的题目是LeetCode154题,昨天讲的,旋转的排序数组的进阶版。

【手绘漫画】图解LeetCode之寻找旋转排序数组中的最小值(LeetCode153题)
在这里插入图片描述

2、题目

首先看一下题目,
在这里插入图片描述
通过改变了一个条件,就让难度从【中等】变成了【困难】。

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

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

在这里插入图片描述
在这里插入图片描述

3、正文

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

在这里插入图片描述
仔细想一下就会发现,重复与否其实不影响我们的二分法,只不过在 nums[mid] == nums[right] 时会有影响。
在这里插入图片描述
这里有个非常好的方法,就是 right--,下面简单分析一个例子:
在这里插入图片描述
可以看到方法可行。
在这里插入图片描述

4、代码

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

故而没丢失。
在这里插入图片描述
在这里插入图片描述

如果有幸帮到你,请帮我点个【赞】,给个【关注】!如果能顺带【评论】给个鼓励,我将不胜感激。

如果想要更多的资源,欢迎关注 @我是管小亮,文字强迫症MAX~

回复【数据结构】即可获取我为你准备的大礼。

想看更多文(段)章(子),欢迎关注微信公众号「程序员管小亮」~

在这里插入图片描述

发布了237 篇原创文章 · 获赞 5104 · 访问量 83万+

猜你喜欢

转载自blog.csdn.net/TeFuirnever/article/details/105255112
今日推荐