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


    在这里插入图片描述

    图解LeetCode刷题计划

    1、写在前面

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

    距离秋招还有:

    在这里插入图片描述
    希望能多刷点题,今天是第一期,争取每天一期,最多两天,欢迎大家监督我。。。公众号监督最好!!!

    在这里插入图片描述
    今天要讲解的题目是LeetCode153题,一道经典的面试题,旋转的排序数组。

    在这里插入图片描述

    2、题目

    首先看一下题目,
    在这里插入图片描述
    从题目给出的信息中,可以获取到的信息有两点:

    1. 数组是排序的;
    2. 数组经过了旋转;

    你可能首先想到的是排个序,然后取个 nums[0]
    在这里插入图片描述
    哈哈,我估计面试官直接就让你 out 了,这种搜索类题目最好还是用二分法!

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

    在这里插入图片描述

    3、正文

    首先分析一下情况,一个排序的数组,即原题给出的,0,1,2,4,5,6,7,这没有问题吧。

    蓝色是目标,绿色是mid
    在这里插入图片描述
    然后旋转了,极端情况有两种,分别是最大值在最左侧和最小值在最右侧的情况。

    正常情况就很多种了。

    根据二分法,先找到 mid,然后向目标移动,比如下图的第一个就是 midright 移动,第二个就是 midleft 移动。
    在这里插入图片描述
    为什么是这样的呢?

    首先,取一个标志,假设取 right 元素,因为最小值偏向左侧。

    因为数组本身带有顺序的原因:

    • 如果 mid 元素大于 right 元素,那么说明右侧有小值,而我们寻找的最小值必然也在右侧;
    • 如果 mid 元素小于 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{
                right=mid;
            }
        }
        return nums[left];
    }
    

    在这里插入图片描述

    5、讨论

    提个问题,为什么 leftmid+1,而 right 却是 mid

    其实这个问题是我自己比较疑惑的一个点,不过我觉得应该是这样的,因为 mid 更偏向于 left,而不是 right,证明如下,所以,left 是不用担心会错失的问题的,但是 right 却容易错失!!!

    在这里插入图片描述
    即:

    • 明确 nums[mid]>nums[right],最小值在右半边,收缩左边界,因为中值肯定不是最小值,左边界可以跨过 mid

    • 明确 nums[mid]<nums[right],最小值在左半边,收缩右边界,因为中值也可能是最小值,右边界只能取到 mid

    在这里插入图片描述

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

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

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

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

    在这里插入图片描述

  • 相关阅读:
    深入解析Hibernate核心接口
    Hibernate基本原理
    深入hibernate的三种状态
    Hibernate commit() 和flush() 的区别
    Hibernate中的merge使用详情解说
    Record is locked by another user
    Vue路由router-link的使用
    Vue-router的基本使用
    Vue把父组件的方法传递给子组件调用(评论列表例子)
    Vue中子组件调用父组件的方法
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13302605.html
Copyright © 2020-2023  润新知