(LeetCode 153)Find Minimum in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
Find the minimum element.
You may assume no duplicate exists in the array.
题目:
给定一旋转有序数组,求该数组的最小值。
思路:
- 二分查找Binary Search
- 比较简单,不详述,主要在于二分查找过程的循环不变量的判断
- 递归思想
- 旋转有序数组的循环不变量:
- 旋转数组的最后一个值一定小于第一个值(无旋转情况例外)。在二分循环时,对于区间的判断很重要。
- 以最右值为pivot,当num[mid]>num[right],为了维持旋转不变量,即数组的第一个值大于最后一个值,应当将left=mid,这样依旧num[left]>num[right]。当num[mid]<num[right],应当将right=mid,这样对于无旋转的数组同样适用,因为num[mid]肯定小于num[right],数组不断地往左收缩,最终会到num[0]。
- 以最左值为pivot,同样可以通过二分求旋转数组的最小值,但对于无旋转数组而言,num[mid]肯定大于num[left],数组会不断地往右收缩,最终会到num[len-1].
- 所以,要么采用最右值来收缩二分查找区间,要么将无旋转数组单独考虑。
- 最小值小于左右两边的值,满足其一即可。
- if(nums[mid]<nums[mid-1]) return nums[mid];
- if(nums[mid]>nums[mid+1]) return nums[mid+1];
- 因为数组是从0下标开始的,因此最好通过第二种情况来判断。
- 方法总结:
- 单独考虑无旋转数组,即一开始就判断num[0]<num[len-1]?如果是,则返回num[0]。再考虑旋转数组,通过最左值或者最右值来收缩二分查找的区间。对于最小值的判断,采用if(nums[mid]>nums[mid+1]) return nums[mid+1];如果出现无旋转数组,单独考虑无旋转数组的话,时间效率更高。
- 不单独考虑无旋转数组,则通过最右值来收缩二分查找的区间。对于最小值的判断,采用if(nums[mid]>nums[mid+1]) return nums[mid+1];
代码:
1、非递归
class Solution {
public:
int findMin(vector<int>& nums) {
int len=nums.size();
int left=;
int right=len-;
int mid;
// if(nums[left]<nums[right])
// return nums[left];
while(left<=right){
if(left==right)
return nums[left];
mid=(left+right)/;
// if(nums[mid]<nums[mid-1])
// return nums[mid];
if(nums[mid]>nums[mid+])
return nums[mid+];
if(nums[mid]>nums[right])
left=mid;
if(nums[mid]<nums[right])
right=mid;
}
}
};
2、递归
class Solution {
public:
int findMin(vector<int> &num) {
int left = , right = num.size() - ;
return BinarySearch(num, left, right);
}
private:
int BinarySearch(vector<int> &num, int left, int right) {
if(left==right) return num[left];
int mid = (left + right) / ;
// if(num[mid] < num[mid - 1]) return num[mid];
if(num[mid] > num[mid + ]) return num[mid + ];
if(num[mid] < num[right]) return BinarySearch(num, left, mid);
if(num[mid] > num[right]) return BinarySearch(num, mid, right);
}
};
(LeetCode 153)Find Minimum in Rotated Sorted Array的更多相关文章
- LeetCode(153) Find Minimum in Rotated Sorted Array
题目 Total Accepted: 65121 Total Submissions: 190974 Difficulty: Medium Suppose a sorted array is rota ...
- LeetCode(154) Find Minimum in Rotated Sorted Array II
题目 Follow up for "Find Minimum in Rotated Sorted Array": What if duplicates are allowed? W ...
- 【LeetCode】154. Find Minimum in Rotated Sorted Array II 解题报告(Python)
[LeetCode]154. Find Minimum in Rotated Sorted Array II 解题报告(Python) 标签: LeetCode 题目地址:https://leetco ...
- LeetCode 新题: Find Minimum in Rotated Sorted Array 解题报告-二分法模板解法
Find Minimum in Rotated Sorted Array Question Solution Suppose a sorted array is rotated at some piv ...
- LeetCode OJ 154. Find Minimum in Rotated Sorted Array II
Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed? Would ...
- LeetCode 新题: Find Minimum in Rotated Sorted Array II 解题报告-二分法模板解法
Find Minimum in Rotated Sorted Array II Follow up for "Find Minimum in Rotated Sorted Array&quo ...
- 【LeetCode】154. Find Minimum in Rotated Sorted Array II (3 solutions)
Find Minimum in Rotated Sorted Array II Follow up for "Find Minimum in Rotated Sorted Array&quo ...
- 【刷题-LeetCode】154 Find Minimum in Rotated Sorted Array II
Find Minimum in Rotated Sorted Array II Suppose an array sorted in ascending order is rotated at som ...
- Leetcode之二分法专题-153. 寻找旋转排序数组中的最小值(Find Minimum in Rotated Sorted Array)
Leetcode之二分法专题-153. 寻找旋转排序数组中的最小值(Find Minimum in Rotated Sorted Array) 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ...
随机推荐
- Problem A&B: 开宝箱 1/2 (最沙雕的做法)(未用指针做) 改:附上一种指针做法
Description 急先锋是一个商人,有一天找到了一个宝箱,宝箱需要正确的密码才能打开.同时他发现宝箱上有一个数字,和一份密码表.密码表上有n个密码,只有一个密码是正确的. 急先锋所在的岛上有m个 ...
- CF 277.5 A.SwapSort 水题
//STL教你做人系列 #include<stdio.h> #include<iostream> #include<math.h> #include<algo ...
- ASP.NET 构建高性能网站 第3篇
HTTP请求的优化 在一个网页的请求过程中,其实整个页面的html结构(就是页面的那些html骨架)请求的时间是很短的,一般是占整个页面的请求时间的10%-20%.在页面加载的其余的时间实际上就是在加 ...
- Ubuntu16.04中安装stlink驱动
系统环境: Vmware12, Ubuntu16.04 Stlink version:v1.4.0 一.安装依赖包: sudo apt-get install libusb-1.0 sudo apt- ...
- X-010 FriendlyARM tiny4412 uboot移植之移植网卡驱动TFTP用起来
<<<<<<<<<<<<<<<<<<<<<<<<< ...
- org.springframework.orm.hibernate3.LocalSessionFactoryBean
Spring整合hibernate在配置sessionFactory时, 启动总是报出javax.transaction.TransactionManager找不到. 原因是:缺少jar包,jta-1 ...
- 【Deep Learning】一、AutoEncoder
Deep Learning 第一战: 完成:UFLDL教程 稀疏自编码器-Exercise:Sparse Autoencoder Code: 学习到的稀疏参数W1: 参考资料: UFLDL教程 稀疏自 ...
- Tasker to auto record incoming or outgoing call
Tasker to auto record incoming or outgoing call most of time, i was thinking of tasker can do the jo ...
- mysql---总体备份和增量备份
总体备份: 对整张表或者整个数据库甚至全部数据库进行备份. 增量备份: 对某一范围内的数据进行备份. 1.总体备份: 对表进行备份: 针对存储引擎为myisam的表,能够直接复制frm.myd.myi ...
- 用最简单的例子理解装饰器模式(Decorator Pattern)
假设有一个公司要做产品套餐,即把不同的产品组合在一起,不同的组合对应不同的价格.最终呈现出来的效果是:把产品组合的所有元素呈现出来,并显示该组合的价格. 每个产品都有名称和价格,首先设计一个关于产品的 ...