码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 寻找旋转排序数组中的最小值 II[经典抽象二分 + 如何破局左中右三者相等]


    经典抽象二分+如何破局左中右三者相等

    • 前言
    • 一、寻找旋转排序数组中的最小值 II
    • 二、经典抽象二分
    • 总结
    • 参考文献

    前言

    这个题是我做过非常经典的抽象二分,不仅判定规则被抽象,而且还会出现判定规则“失灵”现象。
    如何破局?且需挖掘给定数组的特征,利用个性,顺势而为(正向/逆向思维),破掉难题,这便是逻辑,有因必有果,利用其因必得其果,不是偶然。

    一、寻找旋转排序数组中的最小值 II

    在这里插入图片描述

    二、经典抽象二分

    package everyday.medium;
    
    public class FindMin {
        /*
        target:寻找最小值,直接抽象二分,但是注意前 中 尾三者相等的情况。
        将旋转和未旋转的子数组分为两个子数组看。
    
        如何抽象?让nums[mid] 和 nums[0] 比较,若大于nums[0] 则mid必在第一个子数组;如果小于nums[0],那mid一定在第二个子数组中。
        特殊情况:当nums[mid] = nums[0]时,则看nums[mid] 和 nums[high]的关系,若 不等则必是nums[mid] > nums[high],那mid一定在第一个子数组中。
        那若是nums[mid] 也等于 nums[high]呐?如下,
        [2,2,2,2,2,2,2,0,1,2] | [2,2,2,0,1,2,2,2,2,2,2]
              如何破局?注意这两个子数组的个性问题,都是递增的;最大值和最小值挨着,也是唯一一对数,它俩不是递增。
              当左中右相等时,则不急着取mid,可low往前靠一步,破掉这种三者相等的情况。
              若low位就是最大位怎么办?这时可不能low++! 看nums[low] 是否大于nums[low + 1],若是,nums[low]必是数组的最大值,最小值就紧跟其后,直接返回。
    
              为什么不high--来破局?因为如果high已经在最大位上,high是不能动的。为什么不能像low 和 low + 1来判断,因为两个子数组都是递增。唯一一对非递增还是从前面过来才能碰到的。
    
         */
        public int findMin(int[] nums) {
            // 二分寻最大值,最小值会紧跟其后,抽象二分。
            int low = 0, high = nums.length - 1;
            // 二分快速找到比nums[0]小的,第一个小的。
            int first = nums[0];
            while (low < high) {
                int mid = low + (high - low + 1 >>> 1);//这里+1很重要,需要去上整,配合下面的low = mid防止死循环。
                int midVal = nums[mid];
    
                if (midVal > first) low = mid;
                else if (midVal < first) high = mid - 1;
                    // 破局的关键代码。
                else if (midVal == nums[high]) {
                    // 三个重要案例
                    // [3,3,1,3]  [3,1,3,3]  [2,2,2,0,2,2]
                    if (nums[low] <= nums[low + 1]) low++;
                        // 最大值和最小值挨着,也是唯一一对数,它俩不是递增。
                    else return nums[low + 1];
                }
                // 可合并。
                else low = mid;
            }
            return high + 1 == nums.length ? nums[0] : nums[high + 1];
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    总结

    1)经典抽象二分练习。
    2)利用其因(题目的显示 | 隐式(需细心挖掘) 条件/个性特征),必得其果,不会偶然,这便是逻辑。

    参考文献

    [1] LeetCode 寻找旋转排序数组中的最小值 II

  • 相关阅读:
    OpenCASCADE7.6编译
    大数据毕业设计选题推荐-超级英雄运营数据监控平台-Hadoop-Spark-Hive
    《向量数据库指南》——AutoGPT 宣布不再使用向量数据库
    Vue+SpringBoot打造房屋租售信息系统
    python爬虫-某政府网站加速乐(简单版)实例小记
    【Python 零基础入门】常用内置函数 再探
    实际上手体验maven面对冲突Jar包的加载规则
    基于DTU加油站数据采集系统,加油站也能实现智能化
    Apache SeaTunnel 正式发布2.3.5版本,功能增强及多个Bug修复
    There is no getter for property named ‘*‘ in ‘class java.lang.String‘【两种解决方案】
  • 原文地址:https://blog.csdn.net/qq_43164662/article/details/125475728
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号