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

【LeetCode题解】LeetCode 153. 寻找旋转排序数组中的最小值

【题目链接】
153. 寻找旋转排序数组中的最小值
【题目描述】
在这里插入图片描述
在这里插入图片描述
【题解】
以示例1为例,nums=[1,2,3,4,5]nums=[1,2,3,4,5]nums=[1,2,3,4,5],那么旋转后的数组一共有四种情况,分别是
nums0=[1,2,3,4,5]nums0=[1,2,3,4,5]nums0=[1,2,3,4,5]
nums1=[2,3,4,5,1]nums1=[2,3,4,5,1]nums1=[2,3,4,5,1]
nums2=[3,4,5,1,2]nums2=[3,4,5,1,2]nums2=[3,4,5,1,2]
nums3=[4,5,1,2,3]nums3=[4,5,1,2,3]nums3=[4,5,1,2,3]
nums4=[5,1,2,3,4]nums4=[5,1,2,3,4]nums4=[5,1,2,3,4]
通过观察可以发现,numsnumsnums中的最小值为1。考虑数组中的最后一个元素nums[r]nums[r]nums[r],在最小值右侧的元素(不包括最后一个元素本身),它们的值一定都是严格小于nums[r]nums[r]nums[r];而在最小值左侧的元素,它们的值一定都严格大于nums[r]nums[r]nums[r]。因此,我们可以根据这一条性质,通过二分查找的方法找出最小值。
第一种情况:nums[mid]<nums[r]nums[mid]<nums[r]nums[mid]nums[r]
nums=[5,1,2,3,4]nums=[5,1,2,3,4]nums=[5,1,2,3,4]为例,根据二分查找的思路,l=0,r=4,mid=2l=0,r=4,mid=2l=0,r=4,mid=2nums[mid]=2<nums[r]=4nums[mid]=2<nums[r]=4nums[mid]=2nums[r]=4,这说明nums[mid]nums[mid]nums[mid]是最小值右侧的元素,因此可以忽略二分查找区间的右边部分,所以r=mid=2r=mid=2r=mid=2
第二步查找时,l=0,r=2,mid=1l=0,r=2,mid=1l=0,r=2,mid=1nums[mid]=1<nums[r]=2nums[mid]=1<nums[r]=2nums[mid]=1<nums[r]=2,这说明nums[mid]nums[mid]nums[mid]是最小值右侧的元素,因此可以忽略二分查找区间的右边部分,所以r=mid=1r=mid=1r=mid=1
第三步查找时,l=0,r=1,mid=0l=0,r=1,mid=0l=0,r=1,mid=0nums[mid]=5>nums[r]=1nums[mid]=5>nums[r]=1nums[mid]=5nums[r]=1,这说明nums[mid]nums[mid]nums[mid]是最小值左侧的元素,因此可以忽略二分查找区间的左边部分,所以l=mid+1=1l=mid+1=1l=mid+1=1。此时l=r=1l=r=1l=r=1,退出循环,nums[l]=1nums[l]=1nums[l]=1即为最小值。
第二种情况是:nums[mid]>nums[r]nums[mid]>nums[r]nums[mid]nums[r]
nums=[2,3,4,5,1]nums=[2,3,4,5,1]nums=[2,3,4,5,1]为例,根据二分查找的思路,l=0,r=4,mid=2l=0,r=4,mid=2l=0,r=4,mid=2nums[mid]=4>nums[r]=1nums[mid]=4>nums[r]=1nums[mid]=4nums[r]=1,这说明nums[mid]nums[mid]nums[mid]是最小值左侧的元素,因此可以忽略二分查找区间的左边部分,所以l=mid+1=3l=mid+1=3l=mid+1=3
第二步查找时,l=3,r=4,mid=3=3,r=4,mid=3=3,r=4,mid=3nums[mid]=5>nums[r]=1nums[mid]=5>nums[r]=1nums[mid]=5nums[r]=1,这说明nums[mid]nums[mid]nums[mid]是最小值左侧的元素,因此可以忽略二分查找区间的左边部分,所以l=mid+1=4l=mid+1=4l=mid+1=4。此时l=r=4l=r=4l=r=4,退出循环,nums[l]=1nums[l]=1nums[l]=1即为最小值。
由于数组不包含重复元素,并且只要当前的区间长度不为1,midmidmid就不会与rrr重合;而如果当前的区间长度为1,这说明我们已经可以结束二分查找了。因此不会存在nums[mid]=nums[r]nums[mid]=nums[r]nums[mid]=nums[r]的情况。
当二分查找结束时,我们就得到了最小值所在的位置。
【AC代码】

class Solution {
public:int findMin(vector<int>& nums) {int l = 0, r = nums.size() - 1;while(l < r) {int mid = l + r >> 1;if(nums[mid] < nums[r])r = mid;elsel = mid + 1;}return nums[l];}
};

【思考&收获】
传统的二分查找通常是通过midmidmidtargettargettarget的关系来确定查找范围,而这道题通过比较nums[mid]nums[mid]nums[mid]nums[r]nums[r]nums[r]来判断最小值的位置,利用了数组旋转的特性。

http://www.lryc.cn/news/626043.html

相关文章:

  • [优选算法专题二——找到字符串中所有字母异位词]
  • 工业4.0时代,耐达讯自动化Profibus转光纤如何重构HMI通信新标准?“
  • 链表基本运算详解:查找、插入、删除及特殊链表
  • 多线程—飞机大战排行榜功能(2.0版本)
  • 科技云报到:AI推理破局,金融服务如何“逆天改命”
  • 颠覆性进化:OpenAI正式发布GPT-5,AI大模型进入“超级智能”时代
  • bit-Agent正式接入GPT-5,九科信息智能体能力再升级!
  • 电子电气架构 ---SDV技术基础与传统E/E架构有何不同?
  • 免费OCR工具支持哪些文档格式转换
  • 中兴B862AV3.2M/B862AV3.1-M2 晨星mso9385_安卓9_原厂备份救砖包
  • 基于C语言基础对C++的进一步学习_知识补充、组合类、类中的静态成员与静态函数、类中的常对象和常成员函数、类中的this指针、类中的友元
  • 网络编程day3
  • 机器翻译60天修炼专栏介绍和目录
  • 大模型问题:幻觉分类+原因+各个训练阶段产生幻觉+幻觉的检测和评估基准
  • 【技术揭秘】AI Agent操作系统架构演进:从单体到分布式智能的跃迁
  • Incredibuild 新增 Unity 支持:击破构建时间过长的痛点
  • Pygame第11课——实现经典打方块小游戏
  • 数据结构:二叉树oj练习
  • Linux------《零基础到联网:CentOS 7 在 VMware Workstation 中的全流程安装与 NAT 网络配置实战》
  • Apache ShenYu网关与Nacos的关联及如何配合使用
  • AJAX (一)
  • C# DevExpress控件安装使用教程
  • 【学习】Linux 内核中的 cgroup freezer 子系统
  • 【自动化运维神器Ansible】Playbook调用Role详解:从入门到精通
  • 常用css
  • 【C++】C++ 的护身符:解锁 try-catch 异常处理
  • 用java语言完成手写mybatis框架(第2章)
  • 借助AI将infoNES移植到HarmonyOS平台的详细方案介绍
  • Linux操作系统编程——进程间的通信
  • 极海APM32F107V6 gpio模拟串口