Find Minimum in Rotated Sorted Array
Question Solution
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.
SOLUTION 1:
这个题目trick的地方在于,它的旋转pivot次数未知。所以有可能它转了一圈又转回了原处
所以我们代码要处理2种情况:
我们还是用二分法来做。比起全部扫一次,二分法可以做到LogN的复杂度。
1. Sorted
这种情况简单,先计算出mid的值,如果它处在左右的中间,证明这个数列是正常的sorted,直接返回左边。
我们的目的是要找出存在断口的地方。所以我们可以每次求一下mid的值,把mid
跟左边比一下,如果是正常序,就丢掉左边,反之丢掉右边,不断反复直到找到断口。
分析一下:
比如4 5 6 7 0 1 2 从中间断开后,它是由一个有序跟一个无序的序列组成的。
如果left = 0, right = 6,mid = 3, 那么4, 5, 6, 7 是正序, 7, 0, 1,
2是逆序,所以我们要丢掉左边。这样反复操作,直到数列中只有2个数字,就是断开处,这题我们会得到7,0,返回后一个就可以了。
以下图示简单描述了通过三步操作逐步逼近断口处。每一次我们可以扔掉一半,速度是LogN.
注意,丢掉半边时,mid不可以丢掉,因为有可能mid就是答案。
例子: 3, 1, 2 的时候,3, 1是逆序,1, 2是正序,如果你扔掉1,2你就丢掉了答案。
// Solution 1:
public int findMin1(int[] num) {
if (num == null || num.length == 0) {
return 0;
} if (num.length == 1) {
return num[0];
} // 至少有2个元素,才有讨论的价值
int l = 0;
int r = num.length - 1; while (l < r) {
int mid = l + (r - l)/2;
// Means that there is no rotate.
if (num[mid] >= num[l] && num[mid] <= num[r]) {
return num[0];
} // rotate > 0的情况
if (l == r - 1) {
// 当只余下2个元素的时候,这里是断点,右边的是小值
return num[r];
} if (num[mid] >= num[l]) {
// The left side is sorted. Discard left.
l = mid;
} else {
// The right side is sorted.
r = mid;
}
} return 0;
}
SOLUTION 2:
采用九章算法的二分法模板来解:
// bug 1: should not use l = m + 1 and r = m - 1.
// this may discard the minumul value.
A example: 3, 1, 2.
// solution 2:
public int findMin(int[] A) {
if (A == null || A.length == 0) {
return 0;
} if (A.length == 1) {
return A[0];
} else if (A.length == 2) {
return Math.min(A[0], A[1]);
} // 至少有3个元素,才有讨论的价值
int l = 0;
int r = A.length - 1; while (l < r - 1) {
int m = l + (r - l) / 2; // means that there is no rotate.
if (A[m] < A[r] && A[m] > A[l]) {
return A[0];
} // left side is sorted.
if (A[m] > A[l]) {
l = m;
} else {
r = m;
}
} return A[r];
}
while (l < r - 1) {
int m = l + (r - l) / 2; // means that there is no rotate.
... 这里添加各种退出条件,比如找到了目标值等
// left side is sorted.
if (A[m] > A[l]) {
l = m;
} else {
r = m;
}
}
SOLUTION 3:
在解答2的基础之上,可以把判断是否rotated的statement去掉,然后每次丢弃有序数列时,先丢弃右边的。这样子即使是从未rotated的也没有关系,因为一直是丢右边的
直到余下左边最后2个。
public int findMin(int[] num) {
if (num == null || num.length == 0) {
return 0;
} int l = 0;
int r = num.length - 1; while (l < r - 1) {
int m = l + (r - l) / 2; if (num[m] < num[r]) {
// bug 1: should not use l = m + 1 and r = m - 1.
// this may discard the minumul value.
r = m;
} else {
l = m;
}
} return Math.min(num[l], num[r]);
}
SOLUTION 4:
在解答3的基础之上先,预判断是不是旋转过,这样如果没有旋转我们可以直接把解算出即可。
public int findMin(int[] num) {
if (num == null || num.length == ) {
return ;
} int l = ;
int r = num.length - ; if (num[l] < num[r]) {
return num[l];
} while (l < r - ) {
int m = l + (r - l) / ; if (num[m] < num[r]) {
// bug 1: should not use l = m + 1 and r = m - 1.
// this may discard the minumul value.
r = m;
} else {
l = m;
}
} return Math.min(num[l], num[r]);
}
FOLLOW UP:
LeetCode 新题: Find Minimum in Rotated Sorted Array II 解题报告-二分法模板解法
GitHub:
LeetCode 新题: Find Minimum in Rotated Sorted Array 解题报告-二分法模板解法的更多相关文章
-
【LeetCode】153. Find Minimum in Rotated Sorted Array 解题报告(Python)
[LeetCode]153. Find Minimum in Rotated Sorted Array 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode. ...
-
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】Find Minimum in Rotated Sorted Array 解题报告
今天看到LeetCode OJ题目下方多了"Show Tags"功能.我觉着挺好,方便刚開始学习的人分类练习.同一时候也是解题时的思路提示. [题目] Suppose a sort ...
-
LeetCode: Search in Rotated Sorted Array 解题报告
Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...
-
【LeetCode】154. Find Minimum in Rotated Sorted Array II 解题报告(Python)
[LeetCode]154. Find Minimum in Rotated Sorted Array II 解题报告(Python) 标签: LeetCode 题目地址:https://leetco ...
-
【刷题-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
Find Minimum in Rotated Sorted Array Suppose an array sorted in ascending order is rotated at some p ...
-
【LeetCode】153. Find Minimum in Rotated Sorted Array (3 solutions)
Find Minimum in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you ...
-
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 ...
随机推荐
-
uiimage 上传 数据库
之前我所接触的上传图片都是直接与服务器交互的,即 app端要做的就是上传到服务器 现在这个项目却是app先上传到"数据库",由"数据库"传到服务端 下面说主题 ...
-
Http常用状态码
HTTP状态码(HTTP Status Code) 一些常见的状态码为: 200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - 服务不可用 所有状态解释:点击查看 1xx(临时响应 ...
-
TortoiseSVN and TortoiseGit 版本控制图标不见了
突然有一天,代码文件夹上的版本控制图标不见了. 注册表中,将文件夹名重命名,让版本控制的靠前,Computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft ...
-
JDBC 1
Java 中的数据存储技术 在Java中,数据库存取技术可分为如下几类: JDBC直接访问数据库 JDO技术 第三方O/R工具,如Hibernate, ibatis 等 JDBC是java访问数据库的 ...
-
家族企业的常青之道——leo鉴书68
<Leo鉴书(第1辑)>已登陆百度阅读,今后还将不断更新.免费下载地址:http://t.cn/RvawZEx 企业怎样长久传承.怎样长期有效操持活力.是多元化经营还是集中精力打一点,这些 ...
-
关于struts2的web.xml配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "- ...
-
extJS4.2.0 环境搭建教程(一)
一.环境搭建
-
Java进阶(三十二) HttpClient使用详解
Java进阶(三十二) HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们 ...
-
nlp词性标注
nlp词性标注 与分词函数不同,jieba库和pyltp库词性标注函数上形式相差极大. jieba的词性标注函数与分词函数相近,jieba.posseg.cut(sentence,HMM=True)函 ...
-
Java中的public、private、protected,函数修饰符
1.public:public表明该数据成员.成员函数是对所有用户开放的,项目中其他脚本都可以直接进行调用 2.private:private表示私有,私有的意思就是除了脚本之外,项目中其他类都不可以 ...