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

二分查找----5.寻找旋转排序数组中的最小值

题目链接

 

/**

        数组在某处进行旋转,分割为两个独立的递增区间,找出数组的最小值;特殊情况:若旋转次数是数组长度的倍数,则数组不变

        特点:

            常规情况:

                数组被分割为两个独立的子区间,左半区的最小值大于右半区的最大值

                依据数组长度,mid可能落在左半区也有可能落在右半区,最小值在右半区

            特殊情况:

                旋转次数是数组长度的倍数,则数组不变

                此时数组是一个完整的递增区间,取第一个元素即可

        二分策略:

            若left与right已经在一个递增区间中,则直接返回nums[left]即可;本身就是一个递增区间,或经过收缩left来到了右半区。

            若不在一个区间中,则判断mid所在半区;在左半区则淘汰[left,mid],在右半区则淘汰[mid,right]

            经过收缩后再重新判断left,right是否在同一区间,在则直接返回结果,不在则重复上述流程再次收缩

        判断条件:

            nums[left] <= nums[mid] && nums[mid] <= nums[right] ---> [left,right]已经在同一区间,直接返回结果即可

            仅满足:nums[left] <= nums[mid] ---> [left,right]不单调,且mid在左半区; 淘汰[left,mid]

            均不满足,[left,right]不单调,且mid在右半区; 淘汰[mid,right)

*/

class Solution {/**数组在某处进行旋转,分割为两个独立的递增区间,找出数组的最小值;特殊情况:若旋转次数是数组长度的倍数,则数组不变特点:常规情况:数组被分割为两个独立的子区间,左半区的最小值大于右半区的最大值依据数组长度,mid可能落在左半区也有可能落在右半区,最小值在右半区特殊情况:旋转次数是数组长度的倍数,则数组不变此时数组是一个完整的递增区间,取第一个元素即可二分策略:若left与right已经在一个递增区间中,则直接返回nums[left]即可;本身就是一个递增区间,或经过收缩left来到了右半区。若不在一个区间中,则判断mid所在半区;在左半区则淘汰[left,mid],在右半区则淘汰[mid,right]经过收缩后再重新判断left,right是否在同一区间,在则直接返回结果,不在则重复上述流程再次收缩判断条件:nums[left] <= nums[mid] && nums[mid] <= nums[right] ---> [left,right]已经在同一区间,直接返回结果即可仅满足:nums[left] <= nums[mid] ---> [left,right]不单调,且mid在左半区; 淘汰[left,mid]均不满足,[left,right]不单调,且mid在右半区; 淘汰[mid,right)*/public int findMin(int[] nums) {//双指针置于有效部分两端int left = 0, right = nums.length - 1;while(left <= right) {int mid = (left + right) >>> 1;//[left,right]已收缩至右半区直接返回结果即可if(nums[left] <= nums[mid] && nums[mid] <= nums[right]) {return nums[left];}//[left,right]不单调,且mid在左半区else if(nums[left] <= nums[mid]) { left = mid + 1; //淘汰[left,mid]}//[left,right]不单调,且mid在右半区else {right = mid; //淘汰[mid,right) ---> mid恰好为右半区第一个元素,避免错失最小值}}return -1;}
}

http://www.dtcms.com/a/296177.html

相关文章:

  • 【从0开始学习Java | 第3篇】阶段综合练习 - 五子棋制作
  • 「OC」源码学习——属性关键字
  • 基于深度学习的胸部 X 光图像肺炎分类系统(一)
  • STL学习(?map容器)
  • C++性能优化实战‘从毫秒到微秒的底层突围‘
  • C++ 性能优化
  • WPF 控制动画开关
  • 一键修复ipynb,Jupyter Notebook损坏文件
  • redis前期工作:环境搭建-在ubuntu安装redis
  • 基于xxl-job的分片实现分库分表后的扫表
  • Qt WebEngine Widgets的使用
  • MCNN-BiLSTM-Attention分类预测模型等!
  • ChemDraw23软件下载及安装教程|附带软件下载文件|ChemDraw20-23pro版本
  • <<P4116 Qtree3>>
  • 胡良兵Nature Chem Eng:孔隙门控焦耳热精准升级聚乙烯为航油前驱物
  • 中央广播电视总台联合阿里云研究院权威发布《中国人工智能应用发展报告(2025)》:我国依旧需要大力注重人工智能人才的培养
  • Coze工作流-更多图像插件
  • 数据集成难在哪?制造企业该怎么做?
  • Docker多主机网络连接:实现跨主机通信
  • 主流摄像头协议及其开源情况,GB/T 28181协议介绍
  • 配电自动化终端中电源模块的设计
  • uniapp中flex布局gap属性兼容处理
  • PH73211L_VC1/PH73211LQ_VC1:低功耗USB HiFi音频解码器固件技术解析
  • QML WorkerScript
  • 【Spring Boot】热部署终极指南:IDEA高效配置与JRebel替代方案深度解析
  • 第4章唯一ID生成器——4.1 分布式唯一ID
  • Vimba相机二次开发教程,基于Python
  • R 语言科研配色 --- 第 81 期 (附免费下载的配色绘图PPT)
  • 【性能测试】Jmeter+Grafana+InfluxDB+Prometheus Windows安装部署教程
  • 重生学AI第二十集(大结局):完善模型以及学习总结