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

力扣面试150题--寻找旋转排序数组中的最小值

Day 86

题目描述

在这里插入图片描述

思路

我们考虑一下如果选择数组会出现的情况:

  1. 旋转n次,等于没转,那么第一个元素就是最小的
  2. 旋转1-n-1次,那么第一个元素肯定是大于最后一个元素的(这个很重要)
    我们基于以上的思路,那么判断一个数组是否旋转的条件就很明确了,比较第一个元素和最后一个元素的大小。
    好,这里如果没转直接返回第一个元素就好。
    那么发生旋转了,我们就考虑如何二分查找
    二分查找的先决条件是有序,那么哪里有序呢?此时数组是由两段有序数列组成的,第一段肯定不存在我们要的最小值,第二段有序的数组的第一个元素就是最小值

那么我们就开始二分查找,此时数组是由两段有序数列组成的,前一段我们肯定找不到最小的值,我们的mid如果在这个区间(比较num[mid]和最后一元素的值),我们就得让他向前走,所以beg=mid+1,让他快速的进入第二段有序数列中去。

此时我们到了第二段有序的数列,但可能mid和beg是处于第二段有序数列的中间,我们判断这个mid是否是周围的最小值,如果不是,那么我们需要beg和mid向前移动,于是beg–,end=mid
此时由于我们要比较mid左右的值,防止越界 特判一下第一个元素和最后一个元素

class Solution {public int findMin(int[] nums) {int beg=0;int end=nums.length-1;int min=nums[nums.length-1];if(nums[nums.length-1]>=nums[0]){return nums[0];//说明没有旋转}while(beg<=end){int mid=beg+(end-beg)/2;if(nums[mid]>min){//目的是找最后的那个有序数列beg=mid+1;}else{if(mid==nums.length-1||mid==0){return Math.min(nums[0],nums[nums.length-1]);}if(nums[mid]<nums[mid-1]&&nums[mid]<nums[mid+1]){return nums[mid];}else{beg--;end=mid;}}}return min;}
}
http://www.dtcms.com/a/297737.html

相关文章:

  • 互联网金融项目实战(大数据Hadoop hive)
  • 代码随想录算法训练营第五十三天|图论part4
  • Hive【Hive架构及工作原理】
  • Hive-vscode-snippets
  • 微信小程序文件下载与预览功能实现详解
  • nacos安装
  • SpringBoot配置多数据源多数据库
  • Androidstudio 上传当前module 或本地jar包到maven服务器。
  • 线性代数 上
  • Java 大视界 -- 基于 Java 的大数据分布式存储在工业互联网数据管理与边缘计算协同中的创新实践(364)
  • 从入门到进阶:JavaScript 学习之路与实战技巧
  • Nginx 安装与 HTTPS 配置指南:使用 OpenSSL 搭建安全 Web 服务器
  • Django集成Swagger全指南:两种实现方案详解
  • 探索 MyBatis-Plus
  • 智慧灯杆:不止于照明,塔能科技的城市感知网络野心
  • 解码3D格式转换
  • 多智能体(Multi-agent)策略模式:思维链CoT和ReAct
  • 万字解析Redission ---深入理解Redission上锁过程
  • 百度蜘蛛池解析机制:原创
  • ElementPlus:ElMessageBox增加type
  • iOS 加固工具实战解析,主流平台审核机制与工具应对策略
  • ESB 在零售,物流,制造,保险,医疗行业的应用方式
  • 【Linux/Ubuntu】VIM指令大全
  • Adv. Energy Mater.:焦耳热2分钟制造自支撑磷化物全解水电极
  • 基坑渗压数据不准?选对渗压计能实现自动化精准监测吗?
  • 戴尔电脑 Linux 安装与配置指南_导入mysql共享文件夹
  • 如何制定和落实ITIL 4服务请求的标准化与自动化策略
  • c# openxml 打开加密 的word读取内容
  • (笔记)U-boot 2012.10 armv7启动汇编解析
  • C++STL系列之unordered_set和unordered_map