每日一练:LeeCode-153. 寻找旋转排序数组中的最小值【二分法+最值】

已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:

  • 若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]
  • 若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]

注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]]

给你一个元素值 互不相同 的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

示例 1:

输入:nums = [3,4,5,1,2]
输出:1
解释:原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。

示例 2:

输入:nums = [4,5,6,7,0,1,2]
输出:0
解释:原数组为 [0,1,2,4,5,6,7] ,旋转 3 次得到输入数组。

示例 3:

输入:nums = [11,13,15,17]
输出:11
解释:原数组为 [11,13,15,17] ,旋转 4 次得到输入数组。

提示:

  • n == nums.length
  • 1 <= n <= 5000
  • -5000 <= nums[i] <= 5000
  • nums 中的所有整数 互不相同
  • nums 原来是一个升序排序的数组,并进行了 1n 次旋转

思路

方法1:直接返回最小值

  • 首先将数组的第一个元素作为临时最小值 temp
  • 通过一个 for 循环遍历数组中的每一个元素(从第二个元素开始)。
  • 在循环中,首先检查当前元素是否小于临时最小值 temp,如果是,则直接返回当前元素作为最小值,因为数组是有序的,而且是递增排序的,所以在遍历过程中第一个遇到的较小值即为最小值。
  • 如果遍历完成后没有找到更小的值,则返回数组的第一个元素作为最小值,因为数组是有序的,所以第一个元素一定是最小值。
  • 最后返回找到的最小值。
class Solution {public int findMin(int[] nums) {int temp = nums[0]; // 将数组的第一个元素作为临时最小值for (int i = 1; i < nums.length; i++) { // 遍历数组中的每一个元素(从第二个元素开始)if (nums[i] < temp) // 如果当前元素小于临时最小值return nums[i]; // 直接返回当前元素作为最小值,因为数组是有序的}return temp; // 如果遍历完成后没有找到更小的值,则返回数组的第一个元素作为最小值}
}

方法2:二分法

  • 首先初始化左指针 left 为数组的起始位置,右指针 right 为数组的结束位置。
  • 通过一个 while 循环,当左指针小于右指针时,进行二分查找。
  • 在循环中,首先计算中间位置 mid,这里采用 (left + right) / 2 的方式计算中间位置,但为了防止整型溢出,使用了 (right - left) / 2 + left 的方式计算中间位置。
  • 然后通过比较中间元素 nums[mid] 和数组最后一个元素 nums[nums.length - 1] 的大小关系,来确定最小值的位置:
    • 如果中间元素大于最后一个元素,说明最小值在右半部分,因此更新左指针为 mid + 1
    • 否则,最小值在左半部分或者就是中间元素,更新右指针为 mid
  • 最终返回左指针 left 对应的值,即搜索到的满足条件的最小值。
class Solution {public int findMin(int[] nums) {int left = 0; // 初始化左指针为数组的起始位置int right = nums.length - 1; // 初始化右指针为数组的结束位置while (left < right) { // 当左指针小于右指针时,循环继续int mid = left + (right - left) / 2; // 计算中间位置,防止整型溢出if (nums[mid] > nums[nums.length - 1]) { // 如果中间元素大于最后一个元素,说明最小值在右半部分left = mid + 1; // 更新左指针为mid的下一个位置} else {right = mid; // 否则,最小值在左半部分或者就是mid处,更新右指针为mid}}return nums[left]; // 返回左指针对应的值,即搜索到的满足条件的最小值}
}

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

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

相关文章

【Linux】实现进度条小程序

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. 回车和换行3. 缓冲区4. 进度条4.1 倒计时设置4.2 进度条4.2.1 实现简单进度条4.2.2 进度条完善 5. 附进度条代码5.1 Processbar.h5.2 Processbar.c5.3 Main.c5.4 Makefile 1. 前言 在之前已经了解了 【Lin…

中文数字与阿拉伯数字:数字符号的文化交融

title: 中文数字与阿拉伯数字&#xff1a;数字符号的文化交融 date: 2024/3/21 17:46:31 updated: 2024/3/21 17:46:31 tags: 数字起源符号系统差异中文数字特点阿拉伯数字优势转换技术应用文化交流融合数字表达互通 中文数字与阿拉伯数字的关系起源&#xff1a; 中文数字是古…

硬盘、内存、缓存(CPU)和寄存器 空间大小与存取速度的区别及设计原理

一、寄存器和存储器是不同的 很多人会将 寄存器 与 存储器 二者混淆&#xff0c;认为它们是同一个东西。但并不是&#xff01;&#xff01; 寄存器是CPU上的一个模块 存储器是 内存硬盘的统称 二、存取速度的比较 CPU(包含寄存器&#xff0c;缓存) > 内存 > 硬盘 内…

代码学习第24天----回溯算法

随想录日记part24 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.10 主要内容&#xff1a;回溯算法在代码学习中尤其重要&#xff0c;所以今天继续加深对其的理解&#xff1a;1&#xff1a;递增子序列 &#xff1b;2.全排列 &#xff1b;3.全排列II 491.递…

C++ list详解及模拟实现

目录 本节目标 1. list的介绍及使用 1.2 list的使用 2.list的模拟实现 1.对list进行初步的实现 2.头插和任意位置的插入 3.pos节点的删除&#xff0c;头删&#xff0c;尾删 4.销毁list和析构函数 5.const迭代器 6.拷贝构造和赋值操作 3.完整代码 本节目标 1. list的…

如何在Ubuntu使用宝塔面板搭建hadsky轻论坛并发布到公网可随时访问

文章目录 推荐前言1. 网站搭建1.1 网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3 Cpolar稳定隧道&#xff08;本地设置&#xff09;2.4 公网访问测试 总结 推荐 前些天发现了…

IP证书是什么?怎么申请?

IP证书&#xff0c;通俗来说&#xff0c;就像是专门给互联网上的一个门牌号码&#xff08;公网IP地址&#xff09;发放的“安全身份证”。这个证书主要是用来给那些通过IP地址直接访问的网站或服务提供HTTPS加密保护的。通常情况下&#xff0c;SSL证书是颁发给域名&#xff08;…

PostgreSQL和MySQL的异同

0.前言 MySQL是一个关系数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;通过该系统&#xff0c;您可以将数据存储为包含行和列的二维表格。它是一个常用系统&#xff0c;支持许多 Web 应用程序、动态网站和嵌入式系统。PostgreSQL 是一个对象关系数据库管理系统&…

社交媒体的未来:探讨Facebook的发展趋势

引言 在数字化时代&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分。作为全球最大的社交媒体平台之一&#xff0c;Facebook一直在不断地追求创新&#xff0c;以满足用户日益增长的需求和适应科技发展的变革。本文将探讨Facebook在未来发展中可能面临的挑战和应对…

模方软件匀色功能是灰色的不能点是什么原因?

问题如图 模方软件试用版没有匀色权限&#xff0c;正式版才可以用 。 下方链接有1个月的授权&#xff0c;有需要可以点开&#xff0c;软件正式版的可以使用匀色这个功能。https://item.jd.com/10037263088236.html

不会吧!不会吧!居然还有人不知道这个???

在2024年3月4日&#xff0c;由Anthropic推出了Claude3系列的大语言模型&#xff1a;该系列包括三种最先进的型号&#xff08;按功能升序排列&#xff09;&#xff1a;Claude 3 Haiku、Claude 3 Sonnet 和 Claude 3 Opus。每个后续型号都提供越来越强大的性能&#xff0c;允许用…

C++中的内联函数

C中的内联函数 在C中&#xff0c;内联函数是一种特殊的函数&#xff0c;它在编译时会被插入到每个调用它的地方&#xff0c;而不是像普通函数那样在运行时进行调用。这种特性可以减少函数调用的开销&#xff0c;尤其是对于小型、频繁调用的函数&#xff0c;能够提高程序的执行…

用JDBC游标的方式导出mysql数据以及springboot打包成exe程序实践

用JDBC实现游标查询&#xff0c;关键代码在于 Statement 的 fetchSize 属性的设置。 ExportDataService import cn.hutool.core.io.FileUtil; import cn.hutool.core.text.csv.CsvUtil; import cn.hutool.core.text.csv.CsvWriter; import cn.hutool.core.util.StrUtil; impo…

Kafka的分区(partition和副本)

在 Kafka 中&#xff0c;分区&#xff08;Partition&#xff09;是一个逻辑上的概念&#xff0c;它将一个主题&#xff08;Topic&#xff09;中的消息进行分组。每个分区都有一个唯一的编号&#xff0c;称为分区 ID&#xff08;Partition ID&#xff09;&#xff0c;它从 0 开始…

许战海战略文库|橋頭品牌突破区域局限打透全国市场的4个建议

自宣统元年(公元1908年)起&#xff0c;重庆南岸区海棠溪古石桥边诞生了一家传奇火锅店——桥头火锅。凭借深厚的文化底蕴和独特的风味&#xff0c;历经百年沉淀桥头火锅已成为南岸区乃至中华餐饮文化中的璀璨明珠。 桥头火锅不仅荣获了“中华老字号”和“中国名菜”两项殊荣&a…

生产者消费者模式

生产者消费者模式 如何用 BlockingQueue 实现生产者消费者模式如何用 Condition「条件变量」 实现生产者消费者模式如何用 wait/notify 实现生产者消费者模式扩展 生产者消费者模式&#xff0c;生产者消费者模式是多线程编程中非常常见的一种设计模式&#xff0c;它被用于解决生…

部署Elasticsearch集群,实现海量航迹数据存储

文章目录 引言I 集群的部署方式1.1 单主节点1.2 多主节点1.3 节点的角色1.4 查询集群状态II 单主节点2.1 安装Master Node2.2 安装Slave nodeIII 主主模式3.1 node-13.2 node-23.3 参数含义IV Logstash4.1 通过下载来安

【DL经典回顾】激活函数大汇总(三十七)(PLU附代码和详细公式)

激活函数大汇总(三十七)(PLU附代码和详细公式) 更多激活函数见激活函数大汇总列表 一、引言 欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里,激活函数扮演着不可或缺的角色,它们决定着神经元的输出,并且影响着网络的学习能力与…

Python从入门到精通秘籍十

一、Python之了解异常 当在Python中执行代码时&#xff0c;如果发生错误&#xff0c;就会抛出异常&#xff08;Exception&#xff09;。处理异常是编写健壮的代码的重要部分。Python提供了try-except语句来捕获和处理异常。 下面是使用Python代码详细讲解异常处理的例子&…

PyGWalker:Python中的Tableau,数据可视化变得如此简单!

文章目录 1介绍2 安装3 使用4 将数据可视化导出为代码5 总结 1介绍 在数据分析和可视化的领域&#xff0c;Tableau凭借其强大的功能和直观的界面&#xff0c;一直以来都是专业人士的首选工具。然而&#xff0c;对于许多用户而言&#xff0c;Tableau的封闭性和高昂的成本使其难…