深入解读力扣154题:寻找旋转排序数组中的最小值 II(多种方法及详细ASCII图解)

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣!

  • 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注
    在这里插入图片描述

  • 导航

    • LeetCode解锁1000题: 打怪升级之旅:每题都包括3-5种算法,以及详细的代码实现,刷题面试跳槽必备
    • 漫画版算法详解:通过漫画的形式和动态GIF图片把复杂的算法每一步进行详细可视解读,看一遍就掌握
    • python源码解读:解读python的源代码与调用关系,快速提升代码质量
    • python数据分析可视化:企业实战案例:企业级数据分析案例与可视化,提升数据分析思维和可视化能力
    • 程序员必备的数学知识与应用:全面详细的介绍了工程师都必备的数学知识

欢迎订阅本专栏 或者关注公众号 数据分析螺丝钉 回复关键词 【学习资料】免费领取学习资料❤️❤️

在本篇文章中,我们将详细解读力扣第154题“寻找旋转排序数组中的最小值 II”。通过学习本篇文章,读者将掌握如何使用多种方法来解决这一问题,包括线性扫描法和二分查找法。每种方法都将配以详细的解释和ASCII图解,以便于理解。

问题描述

力扣第154题“寻找旋转排序数组中的最小值 II”描述如下:

已知一个长度为 n 的数组,其元素是由范围 [0, n-1] 内的整数构成,并且数组原本是严格递增排序的,但在某个未知的点上进行了旋转(例如,数组 [0, 1, 2, 4, 5, 6, 7] 可能变为 [4, 5, 6, 7, 0, 1, 2])。这次数组中允许重复元素。请你找出其中最小的元素。

示例 1:

输入: nums = [2, 2, 2, 0, 1]
输出: 0

示例 2:

输入: nums = [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1]
输出: 1

解题思路

  1. 初步分析

    • 数组是旋转排序数组,并且包含重复元素,因此最小值会在旋转点附近。
    • 可以使用线性扫描法或改进的二分查找法来找到最小值。
  2. 多种解法

    • 线性扫描法:简单遍历数组,找到最小值。
    • 改进的二分查找法:处理重复元素,提高搜索效率。

线性扫描法

解法思路

线性扫描法是一种直接的方法,通过遍历数组中的每个元素,找到最小值。

步骤
  1. 初始化最小值为数组的第一个元素。
  2. 遍历数组中的每个元素,如果发现比当前最小值还小的元素,则更新最小值。
  3. 返回最小值。
代码实现
def findMinLinear(nums):min_val = nums[0]for num in nums:if num < min_val:min_val = numreturn min_val# 测试案例
print(findMinLinear([2, 2, 2, 0, 1]))  # 输出: 0
print(findMinLinear([2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1]))  # 输出: 1
ASCII图解
数组: [2, 2, 2, 0, 1]
遍历过程:初始最小值: 2比较2: 当前最小值仍为2比较2: 当前最小值仍为2比较0: 更新最小值为0比较1: 当前最小值为0
最终最小值: 0

改进的二分查找法

解法思路

改进的二分查找法利用数组的特性,通过不断缩小搜索范围,快速找到最小值。与标准二分查找法不同的是,需要处理重复元素的情况。

步骤
  1. 初始化左右指针 leftright,分别指向数组的起始和末尾。
  2. left <= right 的条件下,进行循环:
    • 计算中间指针 mid
    • 比较 mid 位置的元素和 right 位置的元素:
      • 如果 mid 元素大于 right 元素,说明最小值在右半部分,调整 left
      • 如果 mid 元素小于 right 元素,说明最小值在左半部分,调整 right
      • 如果 mid 元素等于 right 元素,无法确定最小值的位置,调整 right
  3. 循环结束后,left 指针指向最小值。
代码实现
def findMinBinarySearch(nums):left, right = 0, len(nums) - 1while left < right:mid = (left + right) // 2# 比较 mid 和 right 的值if nums[mid] > nums[right]:left = mid + 1elif nums[mid] < nums[right]:right = midelse:right -= 1  # nums[mid] == nums[right] 的情况return nums[left]# 测试案例
print(findMinBinarySearch([2, 2, 2, 0, 1]))  # 输出: 0
print(findMinBinarySearch([2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1]))  # 输出: 1
ASCII图解
数组: [2, 2, 2, 0, 1]
初始状态: left = 0, right = 41. mid = (0 + 4) // 2 = 2nums[mid] = 2, nums[right] = 12 > 1, 所以最小值在右半部分更新: left = 32. mid = (3 + 4) // 2 = 3nums[mid] = 0, nums[right] = 10 < 1, 所以最小值在左半部分更新: right = 3最终状态: left = 3, right = 3
最小值: nums[left] = 0

复杂度分析

  • 线性扫描法

    • 时间复杂度:O(N),其中 N 是数组的长度。
    • 空间复杂度:O(1),使用了常数空间来存储最小值。
  • 改进的二分查找法

    • 时间复杂度:O(log N) 最坏情况下可能退化为 O(N),因为存在重复元素时,可能每次只能排除一个元素。
    • 空间复杂度:O(1),使用了常数空间来存储左右指针和中间指针。

测试案例分析

  1. 测试案例 1

    • 输入: [2, 2, 2, 0, 1]
    • 输出: 0
    • 解释: 数组在 2 之后旋转,最小值 0 在旋转点之后。
  2. 测试案例 2

    • 输入: [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1]
    • 输出: 1
    • 解释: 数组在最后一个 2 之后旋转,最小值 1 在旋转点之后。

总结

本文详细解读了力扣第154题“寻找旋转排序数组中的最小值 II”,通过线性扫描法和改进的二分查找法两种不同的解法,帮助读者深入理解如何高效地解决这个问题。希望读者通过本文的学习,能够在力扣刷题的过程中更加得心应手。

参考资料

  • 《算法导论》—— Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein
  • 力扣官方题解

🌹🌹如果觉得这篇文对你有帮助的话,记得一键三连关注、赞👍🏻、收藏是对作者最大的鼓励,非常感谢 ❥(^_-)

❤️❤️作者知识有限,如有错误,请各位大佬评论区批评指正,不胜感激❥(^_-)
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/17482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

弘君资本:沪指跌0.46%,电力板块逆市爆发,半导体板块强势

28日&#xff0c;沪指早盘窄幅震动&#xff0c;午后回落走低&#xff1b;深证成指、创业板指大幅下探&#xff1b;两市成交额小幅萎缩。 截至收盘&#xff0c;沪指跌0.46%报3109.57点&#xff0c;深证成指跌1.23%报9391.05点&#xff0c;创业板指跌1.35%报1806.25点&#xff0c…

Windows 11 HBuilder X的安装和环境搭建教程

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 HBuilder X是一个由DCloud推出的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于构建基于HTML、CSS和JavaScript的跨平台应用程序&#xff0c;如微信小程序、App、H5等。它提供了丰富的功能…

【Unity】颜色混合计算

在图形渲染中&#xff0c;颜色混合&#xff08;Color Blending&#xff09;是指将多个颜色值组合在一起以生成最终显示的颜色。颜色混合技术广泛用于处理半透明效果、光照效果和后期处理效果。以下是一些常见的颜色混合模式&#xff1a; 1. 正常混合&#xff08;Normal Blendi…

每日力扣刷题day02(从零开始版)

文章目录 2024.5.23&#xff08;5题&#xff09;1929. 数组串联题解一题解二 1281. 整数的各位积和之差题解一题解二 1137. 第 N 个泰波那契数题解一题解二 2413. 最小偶倍速题解一题解二 2778. 特殊元素平方和题解一题解二 2024.5.23&#xff08;5题&#xff09; 1929. 数组串…

【八股系列】webpack打包时Hash码是怎样生成的?随机值存在一样的情况,如何避免?

文章目录 1. Hash码的生成2. 避免Hash码一致2.1 确保文件内容唯一&#xff1a;2.2 使用chunkhash&#xff1a;2.3 增加文件名前缀&#xff1a;2.4 优化哈希算法&#xff1a;2.5 使用Module IDs&#xff1a;2.6 配置webpack输出选项&#xff1a; 3. 配置生成Hash的规则 1. Hash码…

简单四步完成基于云服务器ARL资产侦察灯塔系统搭建

简单四步完成基于云服务器ARL资产侦察灯塔系统搭建及使用 前言 官网介绍&#xff1a;ARL全称-Asset Reconnaissance Lighthouse&#xff0c;中文含义&#xff1a;资产侦察灯塔系统。 旨在快速侦察与目标关联的互联网资产&#xff0c;构建基础资产信息库。 协助甲方安全团队或…

Elasticsearch reindex操作

需求 我有一个index&#xff1a;test_1&#xff0c;这个index由于各种原因&#xff0c;mapping中出现了下面的type&#xff1a; "u_ori_id_list" : {"type" : "text","fields" : {"keyword" : {"type" : "…

DragonKnight CTF复现(一)

这次的 re 题也是挺难的&#xff0c;按 wp 来学习一波 elec_go 下次遇到这种给了很多东西&#xff0c;又不知道怎么分析的&#xff0c;先百度一下。 Electron程序逆向&#xff08;asar归档解包&#xff09;_asar解包-CSDN博客 [原创] electron开发、打包与逆向分析-软件逆向-…

AutoDL搭建 ChatGLM3

租用新实例 这里选择的西北 B 区、RTX 409024GB 创建虚拟环境并激活 # 安装虚拟环境至数据盘 conda create --prefix /root/autodl-tmp/envs/chatglm3-demo python3.10# 激活虚拟环境 conda activate /root/autodl-tmp/envs/chatglm3-demo拉取ChatGLM3仓库代码 # 开启学术…

代码随想录算法训练营第七天| 454.四数相加II 、383. 赎金信、 15. 三数之和、18. 四数之和

454.四数相加II 题目链接&#xff1a; 454.四数相加II 文档讲解&#xff1a;代码随想录 状态&#xff1a;没做出来&#xff0c;没想到考虑重复的情况&#xff01; 题解&#xff1a; public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {// 结果计数…

Python调用科大讯飞在线语音合成API --内附完整项目

一&#xff0c;注册讯飞账号&#xff0c;并实名制。 讯飞开放平台-以语音交互为核心的人工智能开放平台 (xfyun.cn) 二、找到音频合成&#xff0c;按页面提示申请免费试用。 在线语音合成_免费试用-讯飞开放平台 (xfyun.cn) 三、申请免费使用后&#xff0c;找到API信息如下…

Oracle Active DataGuard 启用实时应用 REDO

Oracle Active DataGuard 启用实时应用 REDO 启用 ADG Real-Time apply 模式&#xff08;只要主库事务提交&#xff0c;备库这边即开始应用事务日志&#xff09;&#xff1a;1、将备机先退出恢复管理模式 SQL> alter database recover managed standby database cancel; 2、…

vscode远程登录阿里云服务器【使用密钥方式--后期无需再进行密码登录】【外包需要密码】

1&#xff1a;windows主机上生成【私钥】【公钥】 1.1生成公钥时不设置额外密码 1.2生成公钥时设置额外密码【给外包人员使用的方法】 2&#xff1a;在linux服务器中添加【公钥】 3&#xff1a;本地vscode连接linux服务器的配置 操作流程如下 1.1本地终端中【生成免密登录…

从0到100,渠道码如何成为SaaS企业增长的加速器

在当今数字化时代&#xff0c;企业的增长策略已不再是单一和线性的。渠道码的出现&#xff0c;为SaaS&#xff08;软件即服务&#xff09;企业提供了一种全新的、多维度的增长途径&#xff0c;真正实现了从0到100的快速增长。 一、渠道码的高可定制性和灵活性&#xff0c;为Sa…

基于.NetCore和ABP.VNext的项目实战二:Swagger

Mag.Blog.Swagger层添加Volo.Abp.AspNetCore和Swashbuckle.AspNetCore包,引用实体层.Domain 添加模块类MagBlogSwaggerModule.cs,依赖MagBlogDomainModule模块,并且重写ConfigureServices和OnApplicationInitialization方法 namespace Mag.Blog.Swagger {[DependsOn(typeof…

位置编码(三) 2D旋转位置编码

Rotary Position Embedding for Vision Transformer https://arxiv.org/abs/2403.13298 Transformer升级之路&#xff1a;4、二维位置的旋转式位置编码 https://kexue.fm/archives/8397 Transformer升级之路&#xff1a;17、多模态位置编码的简单思考 https://kexue.fm/archive…

错误提示:“由于找不到steam_api.dll,无法继续执行代码”修复方法,缺少steam_api.dll文件原因

在尝试运行某些游戏或程序时&#xff0c;用户可能会遇到一个常见的错误提示&#xff1a;“由于找不到steam_api.dll&#xff0c;无法继续执行代码”。这个错误信息表明&#xff0c;系统在启动程序或游戏时无法定位到必要的steam_api.dll文件&#xff0c;这是一个关键的动态链接…

第五更 | 单引号、转义符、双引号、反引号

单引号 在单引号内的都是纯字符&#xff0c;哪怕是空格、特殊字符 [rootyaomm yaomm]# touch ‘*.log’ ##→创建一个名称带【*】的log文件 [rootyaomm yaomm]# ls *.log ##→使用单引号也可以将其当作普通字符 *.log 转义符 转义符可以将特殊字符&#xff0c;例如…

香橙派 AIpro的NPU随手记体验日记

昇腾AI 技术路线 8TOPS INT8&#xff08;FP16&#xff09;AI算力 LPDDR4X 8GB/16GB &#x1f4c5; 20240525 开放了原理图和源码&#xff0c;功能接口就不描述了手册都有描述&#xff0c;新手好好学习可以从底层覆盖到应用一个载板拿下 完成香橙派AIpro上手体验 镜像安装&am…

C++学习---string模拟实现(2)

1.随机插入一个字符串 &#xff08;1&#xff09;insert函数插入一个字符的方法我们在之前的模拟实现里面已经搞过了&#xff0c;那个里面要注意的是这个全体向后挪动的循环过程&#xff0c;这个里面我们要实现的是插入字符串的模拟实现&#xff1b; &#xff08;2&#xff0…