每日算法系列【LeetCode 153】寻找旋转排序数组中的最小值
题目描述
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
(例如,数组 [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】寻找旋转排序数组中的最小值相关推荐
- LeetCode 153. 寻找旋转排序数组中的最小值(二分)
153. 寻找旋转排序数组中的最小值 题意 给定一个无重复元素的升序旋转数组 找出旋转数组的最小值 二分法 mid是向下取整:left相对于mid移动 只要中值小于nums[right],说明最小值一 ...
- LeetCode 153. 寻找旋转排序数组中的最小值【c++/java详细题解】
目录 1.题目 2.思路 3.c++代码 4.java代码 1.题目 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组 nums = [0,1, ...
- Leetcode 153. 寻找旋转排序数组中的最小值 (每日一题 20211014)
已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 ...
- Leetcode 153. 寻找旋转排序数组中的最小值 解题思路及C++实现
解题思路:二分查找 使用二分查找来寻找最小值. left,right,mid分别代表数组中最左边.中间.最右边的元素.这三个数字在旋转数组中的大小比较总共有三种情况. 1.数组是升序的,即 nums[ ...
- php旋转数组找出最小的,LeetCode 153 寻找旋转排序数组中的最小值
链接:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ...
- 65. Leetcode 153. 寻找旋转排序数组中的最小值 (二分查找-局部有序)
已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 ...
- leetcode 153. 寻找旋转排序数组中的最小值(二分查找)
已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 ...
- LeetCode 153 寻找旋转排序数组中的最小值
题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转.例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] . 题解 二分查找 代码 class Soluti ...
- 153. 寻找旋转排序数组中的最小值 golang
153. 寻找旋转排序数组中的最小值 golang Me func findMin(nums []int) int {if len(nums) < 2 {return nums[0]}i, j ...
- LeetCode 154. 寻找旋转排序数组中的最小值 II (二分)
154. 寻找旋转排序数组中的最小值 II 题意 给定一个包含重复元素的升序旋转数组 找出旋转数组的最小值 二分法 class Solution {public int findMin(int[] n ...
最新文章
- NSLog打印自定义对象
- 2009年依然兑现不了的10大IT安全预期
- javascript:void(0)和javascript:;的用法
- .net excel循环插数据_Python实战: 如何将数据从一个Excel文件移动到另一个?
- c++ class struct同名_相对于C语言,C++对struct做了非常多的扩充,功能更全面了
- oracle 存储过程中调用存储过程
- Spring Boot 启动流程
- 一个更好的C++序列化/反序列化库Kapok
- cf——Sasha and a Bit of Relax(dp,math)
- In App Purchases(IAP 应用程序內购买): 完全攻略
- 程序员代码面试指南:IT 名企算法与数据结构题目最优解
- 219-6-3Google浏览器书签备份
- 单片机轻松入门之三:蜂鸣器,单片机驱动蜂鸣器电路
- [转]淘宝的十年技术之路
- 一些前端的开发环境配置
- 0.618方法matlab流程图,0.618法的matlab实现
- S5PV210-uboot解析(三)-start_armboot解析
- 《Planning Algorithm》 第三章:几何表示与变换
- 残躯演绎完美爱情 浙江“轮椅夫妻”温暖千万网友
- 有多少人没有续你的PMP?需要续证吗?