Find Minimum in Rotated Sorted Array I & II
Find Minimum in Rotated Sorted Array I
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.
Notice
You may assume no duplicate exists in the array.
Given [4, 5, 6, 7, 0, 1, 2] return 0
分析:
Although array is rotated, either its left half part or right half part is sorted. We just need to disgard the sorted part, and continue to search in the rotated part. Unlike regular binary search in which start = mid + 1 or end = mid - 1, we need to set start = mid or end = mid, this is to make sure the remaining half is still rotated. When there are only two numbers left, the right one must be the smallest value in the whole rotated array.
public class Solution {
public int findMin(int[] num) {
if (num == null || num.length == ) return -;
if (num.length == ) return num[];
int start = , end = num.length - ;
while (start <= end) {
if (num[start] <= num[end]) return num[start];
if (start + == end) return num[end];
int mid = start + (end - start) / ;
if (num[start] < num[mid]){
start = mid + ;
} else {
end = mid;
}
}
return ;
}
}
递归的方法:
class Solution {
public int findMin(int[] nums) {
if (nums == null || nums.length == ) return -;
return findMinHelper(nums, , nums.length - );
}
private int findMinHelper(int[] nums, int start, int end) {
if (start == end) return nums[start];
if (end - start == ) return Math.min(nums[start], nums[end]);
if (nums[start] < nums[end]) {
return nums[start];
}
int mid = start + (end - start) / 2;
if (nums[start] < nums[mid]) {
return findMinHelper(nums, mid + , end);
} else {
// [3, 1, 2]
return findMinHelper(nums, start, mid);
}
}
}
Find Minimum in Rotated Sorted Array II
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.
Notice
The array may contain duplicates.
Given [4,4,5,6,7,0,1,2] return 0.
Analysis:
In this case, we have duplicates in the array, so, we cannot compare arr[start] and arr[mid] to determine which part is the rotated part. In stead, we have check all the numbers in the left part.
public class Solution {
public int findMin(int[] num) {
if (num == null || num.length == ) return -;
if (num.length == ) return num[];
int start = ;
int end = num.length - ;
if (num[start] < num[end]) return num[start]; // handle case 4 5 6 7 0 1 2
while (start <= end) {
if (start + == end) return num[end]; // eventually, there will be only two numbers left
int mid = start + (end - start) / ;
if (nonDecreasing(num, start, mid)){
start = mid;
} else {
end = mid;
}
}
return ;
}
private boolean nonDecreasing(int[] A, int i, int j) {
for (int k = i; k < j; k++) {
if (A[k] > A[k + ] ) return false;
}
return true;
}
}
递归解法:
class Solution {
public int findMin(int[] nums) {
if (nums == null || nums.length == ) return -;
return findMinHelper(nums, , nums.length - );
}
private int findMinHelper(int[] nums, int start, int end) {
if (start == end) return nums[start];
if (end - start == ) return Math.min(nums[start], nums[end]);
int mid = start + (end - start) / ;
boolean firstHalfSorted = sorted(nums, start, mid);
boolean secondHalfSorted = sorted(nums, mid, end);
if (firstHalfSorted && secondHalfSorted) {
return nums[start];
}
if (firstHalfSorted) {
return findMinHelper(nums, mid + , end);
} else {
return findMinHelper(nums, start, mid);
}
}
private boolean sorted(int[] A, int i, int j) {
for (int k = i; k < j; k++) {
if (A[k] > A[k + ] ) return false;
}
return true;
}
}
Find Minimum in Rotated Sorted Array I & II的更多相关文章
- 【leetcode】Find Minimum in Rotated Sorted Array I&&II
题目概述: Suppose a sorted array is rotated at some pivot unknown to you beforehand.(i.e., 0 1 2 4 5 6 7 ...
- Find Minimum in Rotated Sorted Array I&&II——二分查找的变形
Find Minimum in Rotated Sorted Array I Suppose a sorted array is rotated at some pivot unknown to yo ...
- Leetcode | Find Minimum in Rotated Sorted Array I && II
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...
- 【leetcode】Find Minimum in Rotated Sorted Array I & II (middle)
1. 无重复 Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 ...
- [OJ] Find Minimum in Rotated Sorted Array II
LintCode 160. Find Minimum in Rotated Sorted Array II (Medium) LeetCode 154. Find Minimum in Rotated ...
- leetcode 153. Find Minimum in Rotated Sorted Array 、154. Find Minimum in Rotated Sorted Array II 、33. Search in Rotated Sorted Array 、81. Search in Rotated Sorted Array II 、704. Binary Search
这4个题都是针对旋转的排序数组.其中153.154是在旋转的排序数组中找最小值,33.81是在旋转的排序数组中找一个固定的值.且153和33都是没有重复数值的数组,154.81都是针对各自问题的版本1 ...
- 【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 新题: 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. 寻找旋转排序数组中的最小值 II(Find Minimum in Rotated Sorted Array II)
Leetcode之二分法专题-154. 寻找旋转排序数组中的最小值 II(Find Minimum in Rotated Sorted Array II) 假设按照升序排序的数组在预先未知的某个点上进 ...
随机推荐
- QString,string,char* 在utf8和gbk不同编码下的相互转化
关于编码简介:ascii编码是最开始的编码规则本,里面只收纳了英文.特殊字符.数字等有限字符,采用的是8位一个字节的方式进行编码对照:unicode在ascii码的基础上进行了升级扩展,立志将全世界所 ...
- 字符串使用replaceAll()方法报异常
对字符串使用replaceAll()方法替换 * ? + / | 等字符的时候会报以下异常 Dangling meta character '*' near index 0 这主要是因为这些符号在正则 ...
- Candies CodeForces - 991C(二分水题)
就是二分暴力就好了 为什么要记下来 呵呵....emm你说为什么... 行吧 好吧 我一直以为我的二分出问题了 原来不是 依旧很帅 统计的时候求的减了多少次 然后用次数乘了mid 这样做会使那个人获 ...
- 前端学习 -- Css -- 伪类
伪类和伪元素用来表示元素所处的一个特殊的状态,或者是一个特殊的位置 比如:访问过的超链接,比如普通的超链接,比如获取焦点的文本框当我们需要为处在这些特殊状态的元素设置样式时,就可以使用伪类 为没访问过 ...
- Java EE之JSP
1.使用JSP的原因 编写Servlet代码的时候,向响应中输出HTML文档是非常不方便的. PrintWriter writer = response.getWriter(); writer.app ...
- 读论文Machine Learning for Improved Diagnosis and Prognosis in Healthcare
Deep Learning的基本思想 假设我们有一个系统S,它有n层(S1,…Sn),它的输入是I,输出是O,形象地表示为: I =>S1=>S2=>…..=>Sn => ...
- 左值与右值,左值引用与右值引用(C++11)
右值引用是解决语义支持提出的 这篇文章要介绍的内容和标题一致,关于C++ 11中的这几个特性网上介绍的文章很多,看了一些之后想把几个比较关键的点总结记录一下,文章比较长.给出了很多代码示例,都是编译运 ...
- 【Asp.net入门04】第一个ASP.NET 应用程序-如何添加Web窗体到网站中
添加Web窗体 本部分内容: 什么是web form 怎样添加web form 1.添加Web窗体到项目中 Web 窗体是一项 ASP.NET 功能,您可以使用它为 Web 应用程序创建用户界面.We ...
- 【Asp.net入门02】搭建Asp.net开发环境
本节主要讲解: 什么是asp.net asp.net开发和运行环境介绍 1.什么是ASP.NET Asp.net不是一种编程语言,而是一种开发技术.我们可以利用这种技术所提供的类库,使用C#或者VB编 ...
- 利用oneproxy实现mysql读写分离搭建笔记
功能: 1.具有SQL白名单(防SQL注入)及IP白名单功能的SQL防火墙软件 2.数据库故障切换 3.读写分离 4.分库分表 一.下载 官网下载:http://www.onexsoft. ...