• 【手绘漫画】图解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~

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

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

    在这里插入图片描述

  • 相关阅读:
    用递归获取文件夹以及子文件夹下的所有文件
    C#导入XLS数据到数据库
    张老师生日问题 c# CopyRight: http://blog.moozi.net/
    convert.cpp
    C#中判断扫描枪输入与键盘输入
    C# 执行多条SQL语句,实现数据库事务(通过Hashtable存储数据) .
    GridView 根据多个字段值删除
    泛型入门
    TreeView 控件应用
    事务控制案例(一)
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13302604.html
Copyright © 2020-2023  润新知