当前位置: 首页 > news >正文

【剑指 offer】旋转数组的最小数字

请添加图片描述

✨个人主页:bit me👇
✨当前专栏:算法训练营👇

旋 转 数 组 的 最 小 数 字

核心考点:数组理解,二分查找,临界条件

描述:

有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。给出的所有元素都大于0,若数组大小为0,请返回0。

数据范围:

1 ≤ n ≤ 10000,数组中任意元素的值: 0 ≤ val ≤ 10000

要求:

  • 空间复杂度:O(1)
  • 时间复杂度:O(logn)

示例1:

输入:[3,4,5,1,2]
返回值:1

示例2:

输入:[3,100,200,3]
返回值:3

思路:

  1. 第一种方法:此题就是寻找最小值,最容易普遍的一种思路就是直接遍历,因为是非递减的,所以最小值可能出现在任何一个地方,但是注意,旋转有种特性,旋转之后,有可能出现递减,那么引起递减的第一个数字肯定就是我们要找的最小值。
  2. 第二种方法:由于第一种方法效率比较低下,思路也不够新颖,在我们提到查找的时候,就该想到 " 查找的本质是排除 " 这句话。采用二分查找!因为是旋转非递减数组,所以可以把整个数组分为两半,mid 是中间二分的值,left 是最左边的值,right 是最右边的值,当我们的 mid 值大于 left 值的时候,就说明 mid 处于原始数组前半部分,根据非递减的特性,就说明目标最小值在 mid 的右侧,然后让 left = mid 之后继续进行二分查找,直到找到为止;反之,当我们的 mid 值小于 left 值的时候,就说明 mid 处于原始数组后半部分,根据非递减的特性,就说明目标最小值在 mid 的左侧,然后让 right = mid 之后继续进行二分查找,直到找到为止。
  • 注意非递减:所以有递增和相等两种可能,分别处理即可

第一种方法:

import java.util.ArrayList;
public class Solution {public int minNumberInRotateArray(int [] array) {if(array == null || array.length == 0){return 0;}for(int i = 0; i < array.length-1; i++){if(array[i] > array[i+1]){return array[i+1];}}return array[0];}
}

第二种方法:

  1. 先处理特殊情况,数组为空或者长度为 0 的时候
if(array == null || array.length == 0){return 0;
}
  1. 定义左右端点和中间值
int left = 0;
int right = array.length -1;
int mid = 0;
  1. 二分要循环进行查找,那么就要需要一个条件,条件就是 left < right
while(left < right){//...
}
  1. 后续代码在循环中完善,先考虑特殊情况,数组只有一个元素的时候
if(right - left == 1){mid = right;break;
}
  1. 非递减除了递增就还有左右端和中间值三个元素一样的情况
if(array[left] == array[right] && array[mid] == array[left]){int result = array[left];for(int i = left + 1; i < right; i++){if(result > array[i]){result = array[i];}}return result;
}

在这里我们就进行线性查找,依次遍历比较大小即可

  1. 中间值和左右端点进行比较直到找到为止
mid = (right + left) >> 1;
if(array[mid] >= array[left]){left = mid;
}else{right = mid;
}

总的代码:

import java.util.ArrayList;
public class Solution {public int minNumberInRotateArray(int [] array) {if(array == null || array.length == 0){return 0;}int left = 0;int right = array.length -1;int mid = 0;while(left < right){if(right - left == 1){mid = right;break;}//线性查找if(array[left] == array[right] && array[mid] == array[left]){int result = array[left];for(int i = left + 1; i < right; i++){if(result > array[i]){result = array[i];}}return result;}mid = (right + left) >> 1;if(array[mid] >= array[left]){left = mid;}else{right = mid;}}return array[mid];}
}

相关文章:

【剑指 offer】旋转数组的最小数字

✨个人主页&#xff1a;bit me&#x1f447; ✨当前专栏&#xff1a;算法训练营&#x1f447; 旋 转 数 组 的 最 小 数 字核心考点&#xff1a;数组理解&#xff0c;二分查找&#xff0c;临界条件 描述&#xff1a; 有一个长度为 n 的非降序数组&#xff0c;比如[1,2,3,4,5]…...

GB 9706.1-2020 医用电气设备第1部分:基本安全和基本性能的通用要求-1

这是份什么文件 这是一份中华人民共和国国家标准&#xff0c;具体为GB9706.1—2020&#xff0c;标准适用于医用电气设备&#xff0c;并规定了医用电气设备基本安全和基本性能的通用要求。主要涵盖了医疗电器设备与患者接触的各种要求&#xff0c;包括电气安全、机械防护、防护辐…...

认识C++《共、枚、指1》

目录 前言: 1.共用体的基本知识 2.匿名共用体 3.枚举 3.1设置枚举值 3.2枚举的应用场景 3.3枚举变量的取值范围 4.地址和自由存储空间 5.指针的思想 6.指针的声明和初始化 前言: 指针内容比较多&#xff0c;还需要再出一篇。久等了&#xff01;&#xff01;我看了我的…...

vim 一键配置

PS&#xff1a;本文是为了以后为了方便&#xff0c;做备忘的&#xff0c;今天用的时候找了半天很麻烦。 vim编辑器一键配置 在非root用户下执行上面的语句即可&#xff0c;不要在root用户下直接安装&#xff01; 安装的时候需要输入root用户的密码&#xff0c;请找您的服主要一…...

如何成为一名成功的 PHP 开发者

当今的网络应用开发市场&#xff0c;PHP 一直是其中最受欢迎的语言之一&#xff0c;许多优秀的网络应用程序都是由 PHP 开发人员设计和开发的。如果你想成为一名成功的 PHP 开发者&#xff0c;以下是几个关键步骤&#xff1a; 1. 学习基础知识 首先&#xff0c;你需要掌握 PH…...

UHD安装教程

UHD Universal Hardware Driver&#xff0c;即USRP驱动。 UHD&#xff0c;Windows平台安装教程 uhd驱动安装 http://files.ettus.com/binaries/misc/erllc_uhd_winusb_driver.zip 安装LibUSBx http://files.ettus.com/binaries/uhd/latest_release 下载默认C盘 环境配置 将…...

Unity和UE有啥区别?哪个更适合游戏开发

游戏制作软件中最著名的两个游戏引擎是 Unity 和 Unreal Engine。从独立游戏到大型工作室&#xff0c;许多游戏开发商都在使用它们。如果你打算从事游戏行业工作&#xff0c;你肯定曾经问过自己“我的游戏应该使用 Unity 还是 Unreal Engine&#xff1f;” ” 让我们来了解和比…...

红队内网靶场

文章目录开篇介绍靶场介绍靶场下载以及配置Tomcat Get Shell突破DMZ防火墙拿下域内成员机器将内网机器上线到CS使用Adfind侦察子域信息控制子域DCRadmin登录子域进行权限维持(白银票据/ACL)子域bloodhound获取父域信息分析子域Krbtgt密钥创建跨域金票Dcsync父域PTH父域DC准备打…...

如何合并多个升序链表?

前言 本文主要介绍如何将多个小的升序链表合并一个大的升序链表。 需求描述 给出K个升序链接&#xff0c;要求把这K个升序链表合并成一个&#xff0c;并且这个链表也是升序的。 例如&#xff1a;A [1,5,6]&#xff0c; B [2,3,8], C [4,4,9] 将这3个链表合并成一个链表D…...

23上半年信息系统项目管理师新老教程兼顾使用备考策略

在离考试仅有50多天的时候&#xff0c;软考办发文&#xff1a;“为方便报考信息系统项目管理师的考生进行复习备考&#xff0c;2023年上半年信息系统项目管理师考试第3版、第4版教程兼顾使用”。 ​其实软考办发布这样一条信息&#xff0c;也是为了照顾那些在新版发布以前按第…...

Linux环境搭建SVN服务器并实现公网访问 - cpolar端口映射

文章目录前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6.2 …...

仿牛客网社区Web开发项目代码逐行精读(更新中)

仿牛客网社区Web开发项目怎么看项目&#xff1f;如何调试项目前瞻技术架构项目亮点开始看代码LoginControllerDiscussPostController怎么看项目&#xff1f; pom.xml看技术架构resource看配置文件&#xff0c;这个项目是前后端不分离的以调试为导向&#xff0c;从前端入手检查…...

5G NR调制阶数与EVM关系以及对系统SNR要求分析

移动通信技术对数据传输速率要求越来越高。一种提高传输速率的思路是使用更高阶的QAM 调制方式&#xff0c;例如5G NR 的256QAM PDSCH&#xff0c;微波的1024QAM&#xff0c;2048QAM和4096QAM 调制。更高阶的QAM 调制方式对系统也提出了更高的要求。例如某个系统的EVM 测试结果…...

【NAS群晖drive异地访问】远程连接drive挂载电脑硬盘「内网穿透」

文章目录前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用3. 结语转发自CSDN远程穿透的文章&#xff1a;【群晖…...

react:hooks为什么不能写在条件语句里

背景 最近朋友在面试&#xff0c;说面试官问到了一个问题不会&#xff0c;说为什么 react hooks为什么不能写在条件语句里&#xff0c;今天我们来研究一下这个问题。 我们在来简单实现一个 useState&#xff1a; const reRender () > {stateIndex -1 ReactDOM.render(&…...

模型优势缺陷整理

&#xff08;1&#xff09;BERT 1. 计算资源消耗&#xff1a;bert模型是一个相对较大的模型&#xff0c;具有数亿个参数。因此&#xff0c;为了训练和使用bert模型&#xff0c;需要大量的计算资源和时间。 2. 学习不足问题&#xff1a;尽管bert模型在大规模语料库上进行了预训…...

编写猫咪相册应用 HTML

文章目录1. 标题元素标签2. p元素用于在网站上创建一段文本3. 注释4. 页面主要部分标识标签5. 通过使用img元素来为你的网站添加图片6. 使用锚点元素(a)链接到另一个页面7. 使用 section 元素将照片内容与未来的内容分开8. 无序列表(ul)元素&#xff0c;列表项(li)元素在列表中…...

基于Arduino与LabVIEW的远程家庭监控系统

在基于Arduino与LabVIEW的远程家庭监控系统中&#xff0c;Arduino Uno控制器需要完成以下功能&#xff1a;1&#xff09;通过W5100网络模块接收并判断命令&#xff0c;采集和传输温度、煤气浓度、热释电传感器的数据&#xff0c;并通过W5100网络模块上传给LabVIEW软件。2&#…...

使用FRP(快速反向代理)实现内网穿透——以腾讯云服务器为例

一、FRP简介 FRP&#xff0c;即快速反向代理技术&#xff08;fast reverse proxy&#xff09;。本文的FRP程序是基于github开源项目GitHub - fatedier/frp。当前&#xff0c;该程序可实现&#xff1a;“将位于 NAT 或防火墙后面的本地服务器暴露给互联网”。它目前支持 TCP 和…...

d跨语言链接优化

原文 使用LDC的(LTO)链接时优化的简短文章,包含演示了如何提高程序性能的简单示例.因为LTO在LLVMIR级别工作,因此可跨越C/D语言优化! 重要提示:LDC/LLVM的LTO在窗口上不可用. 链接时优化 (LTO)链接时优化是指链接时的程序优化.链接器提取所有目标文件在一起,并合并到一个程序…...

【Linux】-- 进程概念的引入

目录 硬件 冯诺依曼体系结构 冯诺依曼体系结构推导 重点概念 网络数据流向 软件 操作系统(Operator System - OS) 概念 定位 进程内核数据结构PCB&#xff08;task_struct&#xff09; 通过系统调用创建进程-fork初始 fork基本用法 使用if进行分流 查看运行效果 …...

一文看懂“低代码、零代码”是什么?有什么区别?

低代码和零代码近几年热度一直居高不下&#xff0c;乍一看&#xff0c;很容易混淆低代码和零代码开发平台—— 因为它们都是传统开发的替代方案&#xff0c;旨在通过类似于可视化编程的功能加速软件开发过程。 但二者根本不是一回事。从开发人员经验 、目标角色到使用场景&…...

【华为OD机试真题】去除多余的空格(java)

去除多余空格 知识点字符串数组Q队列时间限制:2s空间限制:256MB限定语言:不限 题目描述: 去除文本多余空格,但不去除配对单引号之间的多余空格。给出关键词的起始和结束 下标,去除多余空格后刷新关键词的起始和结束下标。 输入: Life is painting a picture, not …...

【SQL 必知必会】- 第十三课 创建高级联结

目录 使用表别名 Oracle 中没有AS 使用不同类型的联结 自联结 用自联结而不用子查询 自然联结 外联结 全外联结 使用带聚集函数的联结 使用联结和联结条件 使用表别名 SQL 除了可以对列名和计算字段使用别名&#xff0c;还允许给表名起别名。这样做有两个主要理由&#xff…...

ios逆向工具有那些

以下是一些常用的 iOS 逆向工具&#xff1a; Cycript&#xff1a;一种用于在运行时动态分析和修改 iOS 应用程序的强大工具&#xff0c;可以与应用程序进行交互式调试和注入代码。 Frida&#xff1a;一个强大的动态二进制插桩工具&#xff0c;可以在运行时修改应用程序的行为&…...

【软件设计师14】UML建模

UML建模 稳定出一个&#xff0c;但是由于UML的图比较多&#xff0c;所以这种题比数据流图和数据库难度高 一般都会考用例图和类图&#xff0c;再附加其他的图 1. 用例图 包含关系include&#xff1a;比如登记外借信息必须先有用户登录 扩展关系extend&#xff1a;修改书籍…...

容器镜像的设计原理

1 概述&#xff1a; 1.1 历史概要 2016年&#xff0c;Docker制定了镜像规范v2&#xff0c;并在Docker 1.10中实现了这个规范。镜像规范v2分为Schema 1和Schema 2。 Schema 1主要兼容使用v1规范的Docker客户端&#xff08;从2017年2月起&#xff0c;镜像规范v1不再被Registry支…...

arm64异常向量表

arm64异常向量表1 arm64异常向量表2 linux arm64异常向量表3 kernel_ventry宏4 异常向量表的保存4. VBAR_ELx寄存器4.2 __primary_switched4.3 __primary_switched1 arm64异常向量表 When an exception occurs, the processor must execute handler code which corresponds to …...

【测试面试】吐血整理,大厂测试开发岗面试题(1~4面),拿下年40w...

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 自动化测试面试题&am…...

SpringSecurity之权限模块设计

目录 前言 实现思路 代码结构 使用说明 前言 前面我们了解了关于微服务权限设计方案以及J W T的相关介绍&#xff0c;今天我们来聊一下&#xff0c;如何避免自己重复的写相同的代码&#xff0c;一次代码实现&#xff0c;即可完美复制到任何项目中实现权限相关的功能。 实现…...