题目描述

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

(例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2])。

请找出其中最小的元素。

你可以假设数组中不存在重复元素。

示例1

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

示例2

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

题解

这题如果直接遍历一遍的话,时间复杂度是 ,也能过。但是这题显然想要你更快,也就是用 的时间复杂度来做出来,那我们只能选择用二分法。

因为序列从中间切开来,然后调换过顺序,所以是先上升,再下降一下,然后再上升。并且第二段上升的最大值 是一定小于第一段上升的最小值 的,所以最小值一定是第二段的第一个数。

假设我们二分的时候,左端点 l ,右端点 r ,中间点是 m 。

如果 ,那说明左端点在第一段,右端点在第二段。这时如果 ,那么 m 也在第一段,所以 l 需要右移;否则的话 m 在第二段, r 需要左移。

如果 ,那么两个端点都在第二段,是单调上升的,那最小值一定就是 l 。

代码

c++

        class Solution {public:int findMin(vector<int>& nums) {int l = 0, r = nums.size() - 1;while (l < r) {int m = (l + r) / 2;if (nums[l] > nums[r]) {if (nums[m] >= nums[l]) {l = m + 1;} else {r = m;}} else {r = l;}}return nums[r];}
};

python

        class Solution:def findMin(self, nums: List[int]) -> int:l, r = 0, len(nums)-1while l < r:m = (l + r) // 2if nums[l] > nums[r]:if nums[m] >= nums[l]:l = m + 1elif nums[m] < nums[r]:r = melse:r = lreturn nums[r]

每日算法系列【LeetCode 153】寻找旋转排序数组中的最小值相关推荐

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

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

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

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

  3. Leetcode 153. 寻找旋转排序数组中的最小值 (每日一题 20211014)

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

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

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

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

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

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

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

  7. leetcode 153. 寻找旋转排序数组中的最小值(二分查找)

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

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

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

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

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

  10. LeetCode 154. 寻找旋转排序数组中的最小值 II (二分)

    154. 寻找旋转排序数组中的最小值 II 题意 给定一个包含重复元素的升序旋转数组 找出旋转数组的最小值 二分法 class Solution {public int findMin(int[] n ...

最新文章

  1. NSLog打印自定义对象
  2. 2009年依然兑现不了的10大IT安全预期
  3. javascript:void(0)和javascript:;的用法
  4. .net excel循环插数据_Python实战: 如何将数据从一个Excel文件移动到另一个?
  5. c++ class struct同名_相对于C语言,C++对struct做了非常多的扩充,功能更全面了
  6. oracle 存储过程中调用存储过程
  7. Spring Boot 启动流程
  8. 一个更好的C++序列化/反序列化库Kapok
  9. cf——Sasha and a Bit of Relax(dp,math)
  10. In App Purchases(IAP 应用程序內购买): 完全攻略
  11. 程序员代码面试指南:IT 名企算法与数据结构题目最优解
  12. 219-6-3Google浏览器书签备份
  13. 单片机轻松入门之三:蜂鸣器,单片机驱动蜂鸣器电路
  14. [转]淘宝的十年技术之路
  15. 一些前端的开发环境配置
  16. 0.618方法matlab流程图,0.618法的matlab实现
  17. S5PV210-uboot解析(三)-start_armboot解析
  18. 《Planning Algorithm》 第三章:几何表示与变换
  19. 残躯演绎完美爱情 浙江“轮椅夫妻”温暖千万网友
  20. 有多少人没有续你的PMP?需要续证吗?

热门文章

  1. javascript入门之私有变量
  2. 【翻译】IdentityServer4:基于资源的配置
  3. [UE4]复制引起的重复对象
  4. 关于明星投票系统的作业分享
  5. 针对不同手机系统的LBS地图定位解决方案
  6. Mysql分页之limit用法与limit优化
  7. ZeroC Ice demo构建(继承Ice::Application类)
  8. python 自动回收机制
  9. Js/Jquery获取input file的文件名
  10. Fragment控件初始化