Vison's Blog
所有文章
文章总览
编辑器
Publications
About Me
Search
目录
#toc-container
下载Markdown文件
【4.8】LeetCode每日一题· 寻找旋转排序数组中的最小值
2021年04月08日 8时47分
标签:
LeetCode
二分
## 题目描述 已知一个长度为`n`的数组,预先按照升序排列,经由`1`到`n`次**旋转**后,得到输入数组。例如,原数组`nums = [0,1,2,4,5,6,7]`在变化后可能得到: * 若旋转`4`次,则可以得到`[4,5,6,7,0,1,2]` * 若旋转`4`次,则可以得到`[0,1,2,4,5,6,7]` 注意,数组`[a[0], a[1], a[2], ..., a[n-1]]`**旋转一次**的结果为数组`[a[n-1], a[0], a[1], a[2], ..., a[n-2]]`。 给你一个元素值**互不相同**的数组`nums`,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的**最小元素**。 #### 示例1 ``` 输入:nums = [3,4,5,1,2] 输出:1 解释:原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。 ``` #### 示例2 ``` 输入:nums = [4,5,6,7,0,1,2] 输出:0 解释:原数组为 [0,1,2,4,5,6,7] ,旋转 4 次得到输入数组。 ``` #### 示例3 ``` 输入:nums = [11,13,15,17] 输出:11 解释:原数组为 [11,13,15,17] ,旋转 4 次得到输入数组。 ``` #### 提示 ``` n == nums.length 1 <= n <= 5000 -5000 <= nums[i] <= 5000 nums 中的所有整数 互不相同 nums 原来是一个升序排序的数组,并进行了 1 至 n 次旋转 ``` #### 来源 > 来源:力扣(LeetCode) > 链接:[题目链接](https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array "题目链接") ## 解题思路 和昨天[搜索旋转排序数组II](http://www.vison307.com/59/)思路类似。 因为如果我们对旋转数组进行二分,那么必定有一个子数组是**单调的**,因此我们对于单调的子数组,可以确定其**左端点是一个可能的最小值点**,然后对另一部分非单调的子数组继续二分判断即可。 需要注意的是二分端点的取法,容易出现错误。 时间复杂度$$O(\log n)$$,空间复杂度$$O(1)$$。 此外[官方题解](https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/solution/xun-zhao-xuan-zhuan-pai-xu-shu-zu-zhong-5irwp/)的写法更简洁,在此记录一下。 ## 代码 ```cpp class Solution { public: int findMin(vector
& nums) { int l = 0, r = nums.size()-1, min_num = INT_MAX, mid; while(l < r){ mid = ((r-l) >> 1) + l; // 左子数组nums[l..mid](包括mid)))有序 if(nums[l] < nums[mid]){ min_num = min(min_num, nums[l]); l = mid+1; }else{// 右子数组nums[mid+1..r](包括r)有序 min_num = min(min_num, nums[mid+1]); r = mid; } } return min(min_num, nums[l]); } };; } }; ``` ## 用时和内存 > 执行用时:0 ms,在所有 C++提交中击败了100.00%的用户 > 内存消耗:9.8 MB,在所有 C++提交中击败了80.81%的用户
所有评论
暂无评论
新增评论
评论
邮箱
邮箱仅作验证使用
图形验证码
邮箱验证码
发送验证码
发表评论
所有评论
暂无评论