
力扣:搜索旋转排序数组中最小值 (先看)
发布日期:2021-05-08 20:01:08
浏览次数:22
分类:精选文章
本文共 2069 字,大约阅读时间需要 6 分钟。
题目描述
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
例如,数组 [ 0 , 1 , 2 , 4 , 5 , 6 , 7 ] 可能变为 [ 4 , 5 , 6 , 7 , 0 , 1 , 2 ] 。 请找出其中最小的元素。题目分析
对于在 有序数组 中的搜索问题,优先考虑使用 二分查找 解决
这里虽然 进行了旋转 , 但旋转点左右两侧仍然是有序,且 右区间最大值是小于左区间的最小值 , 即 max ( right ) < min ( left ) , 该属性可作为压缩区间的重要依据 ,具体分析如下 1、找到数组的中间元素 mid 2、如果 num [ mid ] > num [ 0 ] ,说明 最小值 在 ( mid + 1 ,right ) 之间 反之 最小值 在 ( left ,mid - 1 ) 之间 { n u m [ m i d ] > n u m [ 0 ] left = mid + 1 n u m [ m i d ] < n u m [ 0 ] right = mid - 1 \begin{cases} num[mid] > num[0]& \text{left = mid + 1}\\ num[mid] < num[0]& \text{right = mid - 1} \end{cases} { num[mid]>num[0]num[mid]<num[0]left = mid + 1right = mid - 1 3、判断的终止条件,从旋转点处分析,不难发现其中规律 , 只需要判断最小值和前一个值,之间的大小关系。 m i n V a l u e = { n u m [ m i d ] > n u m [ m i d + 1 ] return num[mid + 1] n u m [ m i d − 1 ] > n u m [ m i d ] return num[mid] minValue = \begin{cases} num[mid] > num[ mid + 1]& \text{return num[mid + 1]}\\ num[mid-1] > num[mid]& \text{return num[mid]} \end{cases} minValue={ num[mid]>num[mid+1]num[mid−1]>num[mid]return num[mid + 1]return num[mid]class Solution { public int findMin(int[] nums) { // 1. 只有一个元素 if(nums.length == 1) return nums[0]; // 2. 如果第一个元素小于最后一个,说明数组没有旋转,数组第一个就是最小值 int left = 0 , right = nums.length - 1; if(nums[0] < nums[right]) return nums[0]; while(left <= right){ int mid = left + (right - left) / 2; // 如果 nums[mid] > nums[mid + 1] , mid + 1 就是最小值 if(nums[mid] > nums[mid + 1]){ return nums[mid + 1]; } // 如果 nums[mid - 1] > nums[mid] , mid 就是最小值 if(nums[mid - 1] > nums[mid]){ return nums[mid]; } // 如果 nums[mid - 1] < nums[mid] < nums[mid + 1] 说明需要继续搜索 // 1. 如果 nums[mid] > nums[0] , 即需要 搜索右区间 // 2. 如果 nums[mid] < nums[0] , 即需要 搜索左区间 if(nums[mid] > nums[0]){ left = mid + 1; } else if(nums[mid] < nums[0]){ right = mid - 1; } } return -1; // 最终不会走这个 return }}
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年03月30日 23时39分50秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Python 面向对象进阶
2021-05-09
Linux常用统计命令之wc
2021-05-09
Git安装及使用以及连接GitHub方法详解
2021-05-09
docker容器与虚拟机的区别
2021-05-09
shell脚本里使用echo输出颜色
2021-05-09
Python2跟Python3的区别
2021-05-09
并发编程——IO模型详解
2021-05-09
Java之封装,继承,多态
2021-05-09
wait()与notify()
2021-05-09
使用js打印时去除页眉页脚
2021-05-09
Spring security OAuth2.0认证授权学习第二天(基础概念-RBAC)
2021-05-09
ORA-00904: "FILED_TYPE": 标识符无效
2021-05-09
数据仓库系列之维度建模
2021-05-09
Scala教程之:函数式的Scala
2021-05-09
java中DelayQueue的使用
2021-05-09
线程stop和Interrupt
2021-05-09
Android中定时执行任务的3种实现方法
2021-05-09
nodejs中npm常用命令
2021-05-09
基于Vue2.0+Vue-router构建一个简单的单页应用
2021-05-09