当前位置: 首页 > 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.dtcms.com/a/339196.html

相关文章:

  • HJ2 计算某字符出现次数
  • C语言关于函数传参和返回值的一些想法2(参数可修改的特殊情况)
  • 从数据孤岛到实时互联:Canal 驱动的系统间数据同步实战指南
  • 在职老D渗透日记day21:sqli-labs靶场通关(第27a关)get联合注入 过滤select和union “闭合
  • C# 13 与 .NET 9 跨平台开发实战(第一章:开发环境搭建与.NET概述)
  • Milvus 向量数据库中的索引类型
  • SQL 语句进阶实战:从基础查询到性能优化全指南
  • K8s命名空间:资源隔离与管理的核心
  • 轻量级milvus安装和应用示例
  • 一文精通 Swagger 在 .NET 中的全方位配置与应用
  • 软件测试-Selenium学习笔记
  • Dify-MCP服务创建案例
  • 循环高级综合练习①
  • 46 C++ STL模板库15-容器7-顺序容器-双端队列(deque)
  • 人工智能统一信息结构的挑战与前景
  • Vue3编程中更多常见书写错误场景
  • 使用OpenCV计算灰度图像的质心
  • 云原生堡垒机渗透测试场景
  • 所有普通I/O口都支持中断的51单片机@Ai8051U, AiCube 图形化配置
  • 微服务架构的演进:从 Spring Cloud Netflix 到云原生新生态
  • 大模型微调RAG、LORA、强化学习
  • 如何使用VNC对openEuler系统进行远程图形化操作
  • Ubuntu Server 22.04 k8s部署服务较时,文件描述符超过限制的处理方法
  • RabbitMQ:SpringBoot+RabbitMQ 多消费者绑定同一队列
  • Node.js 在 Windows Server 上的离线部署方案
  • leetcode349. 两个数组的交集
  • 轻度娱乐浪潮下定制开发开源AI智能名片S2B2C商城小程序的机遇与策略
  • 厚板数控矫平机的“第三堂课”——把视角拉远,看看它如何重塑整条制造链
  • 供水设备智慧化管理物联网解决方案:远程监控与运维
  • 搭建最新--若依分布式spring cloudv3.6.6 前后端分离项目--步骤与记录常见的坑