问题描述

假设按照升序排序的数组在预先未知的某个点上进行了旋转。例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] 。

请找出其中最小的元素。

示例 1:

输入:nums = [3,4,5,1,2]
输出:1

示例 2:

输入:nums = [4,5,6,7,0,1,2]
输出:0

示例 3:

输入:nums = [1]
输出:1

提示:

1 <= nums.length <= 5000
-5000 <= nums[i] <= 5000
nums 中的所有整数都是 唯一 的
nums 原来是一个升序排序的数组,但在预先未知的某个点上进行了旋转

解题思路

在二分搜索中,我们找到区间的中间点并根据某些条件决定去区间左半部分还是右半部分搜索。

由于给定的数组是有序的,我们就可以使用二分搜索。然而,数组被旋转了,所以简单的使用二分搜索并不可行。

在这个问题中,我们使用一种改进的二分搜索,判断条件与标准的二分搜索有些不同。

我们希望找到旋转排序数组的最小值,如果数组没有被旋转呢?如何检验这一点呢?

如果数组没有被旋转,是升序排列,就满足 last element > first element。

2 3 4 5 6 7

上面例子中 7>2 。说明数组仍然是有序的,没有被旋转。

4 5 6 7 2 3

上面的例子中 3 < 4,因此数组旋转过了。这是因为原先的数组为 [2, 3, 4, 5, 6, 7],通过旋转较小的

[2, 3] 移到了后面,也就是 [4, 5, 6, 7, 2, 3]。因此旋转数组中第一个元素 [4] 变得比最后一个元素大。

这意味着在数组中你会发现一个变化的点,这个点会帮助我们解决这个问题,我们称其为变化点。

在这个改进版本的二分搜索算法中,我们需要找到这个点。下面是关于变化点的特点:

所有变化点左侧元素 > 数组第一个元素

所有变化点右侧元素 < 数组第一个元素

算法

找到数组的中间元素 mid。

如果中间元素 > 数组第一个元素,我们需要在 mid 右边搜索变化点。

如果中间元素 < 数组第一个元素,我们需要在 mid 左边搜索变化点。

当我们找到变化点时停止搜索,当以下条件满足任意一个即可:

nums[mid] > nums[mid + 1],因此 mid+1 是最小值。nums[mid - 1] > nums[mid],因此 mid 是最小值。

实现代码

class Solution {public int findMin(int[] nums) {int n=nums.length;//如果数组中只有一个元素,就直接返回即可if(n==1){return nums[0];}//如果最后一个元素直接大于第一个元素,就直接返回即可if(nums[n-1]>nums[0]){return nums[0];}int left=0,right=n-1;int mid;while(left<=right){mid=(left+right)>>1;if(mid>0 && nums[mid]<nums[mid-1]){return nums[mid];}if(mid<n-1 && nums[mid]>nums[mid+1]){return nums[mid+1];}if(nums[mid]>nums[0]){left=mid+1;}else{right=mid-1;}}return -1;}
}

leetcode题解153-寻找旋转排序数组的最小值相关推荐

  1. LeetCode 153. 寻找旋转排序数组中的最小值【c++/java详细题解】

    目录 1.题目 2.思路 3.c++代码 4.java代码 1.题目 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组 nums = [0,1, ...

  2. LeetCode 153. 寻找旋转排序数组中的最小值(二分)

    153. 寻找旋转排序数组中的最小值 题意 给定一个无重复元素的升序旋转数组 找出旋转数组的最小值 二分法 mid是向下取整:left相对于mid移动 只要中值小于nums[right],说明最小值一 ...

  3. 153. 寻找旋转排序数组中的最小值 golang

    153. 寻找旋转排序数组中的最小值 golang Me func findMin(nums []int) int {if len(nums) < 2 {return nums[0]}i, j ...

  4. leetcode刷题 153.寻找旋转排序数组中的最小值

    题目分析: 解法一: 该题是用来寻找最小值,我们可以直接用数组求最小值的方法来进行求解,但是我们观察到此题数组是一个 旋转数组,只要除第一位外后面每一位比第一位小,那么它就是最小值,否则第一位就是最小 ...

  5. LeetCode 153 寻找旋转排序数组中的最小值

    题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转.例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] . 题解 二分查找 代码 class Soluti ...

  6. Leetcode 153. 寻找旋转排序数组中的最小值 解题思路及C++实现

    解题思路:二分查找 使用二分查找来寻找最小值. left,right,mid分别代表数组中最左边.中间.最右边的元素.这三个数字在旋转数组中的大小比较总共有三种情况. 1.数组是升序的,即 nums[ ...

  7. php旋转数组找出最小的,LeetCode 153 寻找旋转排序数组中的最小值

    链接:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ...

  8. leetcode 153. Find Minimum in Rotated Sorted Array | 153. 寻找旋转排序数组中的最小值(二分查找)

    题目 https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/ 题解 使用二分法,不断地删掉 数组左边的增序列 和 数组右 ...

  9. 65. Leetcode 153. 寻找旋转排序数组中的最小值 (二分查找-局部有序)

    已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 ...

最新文章

  1. python下线程以及锁
  2. linux硬盘目录下,Linux 新添加的硬盘格式化并挂载到目录下
  3. 【基础算法】 GBDT/XGBoost 常见问题
  4. Android中如何使控件保持固定宽高比
  5. C# -- 多线程向同一文件写入
  6. SQL | 目录(持续更新)
  7. EOS全球行南京站:降低用户及开发者门槛仍是2019 EOS关键词
  8. [FATAL] [DBT-10317] Specified SID Name (lhr122) already exists.
  9. MySQL设置字符编码
  10. 【Python56--爬取妹子图】
  11. linux设备模型七(device_driver细节)
  12. 分享一个商品历史价格查询的网站
  13. 零信任架构:下一代网络安全架构?
  14. mac电脑抹掉数据要多久_Mac系统如何恢复出厂设置
  15. 让机器学习助力医疗领域
  16. UserWarning: Glyph 20809 (\N{CJK UNIFIED IDEOGRAPH-5149}) missing from current font解决方法
  17. android实现仿真键盘(KeyboardView适配)
  18. 对io.UnsupportedOperation: fileno错误的解决办法
  19. AIO-3588JQ 8K AI工业主板
  20. scandir 介绍

热门文章

  1. 全球首富贝索斯离婚第二天 出轨对象女主播宣布离婚...
  2. 华为P30 Pro现身安兔兔:未开性能模式跑分超28万
  3. 黄章爆料魅族16s/16s Plus更多信息 无线充电已做到24W
  4. android 分析boot.img,Android 系统准备知识-bootimg文件的结构
  5. Unity界面插件NGUI核心组件说明
  6. 智能控制第四版程序代码_晋中成本低的智能水表方便了人们生活
  7. 使用c++制作微服务计算服务
  8. QQ消息支持HTML吗,WebQQ全面升级支持IE9 HTML5无处不在
  9. 使用Struts接受Ajax请求并且返回Json数据
  10. 95-34-035-Context-HeadContext和TailContext