O(n)的算法就不说了,这题主要考查的是 O(logn)的算法。

有序数组easy想到使用二分查找解决。这题就是在二分基础上做一些调整。数组仅仅有一次翻转,能够知道原有序递增数组被分成两部分,这俩部分都是有序递增的(这题仅仅须要考虑有序数组的递增情况)。

假如翻转后的数组以第 x 个结点分为两部分 A[0..x] 和 A[x+1..n]。则 A[0..x] 这一段是有序递增的, A[x+1..n] 这一段也是有序递增的。

而且由于原数组是有序递增的,A[0..x] 中全部数都会大于 A[x+1..n] 中的不论什么数。所以我们事实上就是须要找到结点 A[x+1]。这个结点的值就是最小值。

考虑数组 A[i..j],中间结点 m (m = (i + j ) / 2)。

A[i] < A[j]:数组是递增的,说明已经找到 x 结点,而且 x 等于 i。

A[i] >= A[j]:数组不是递增的,说明 x 结点还没有找到,这时对照中间结点 A[m]

A[m] > A[i]: 则数组中 A[i..m] 这一段是有序递增的,翻转结点 x 定不会在这一段中。这时我们仅仅须要考虑 A[m+1..j] 这一段。

A[m] < A[i]:说明翻转结点 x 在 A[i..m]中。

另外特别考虑仅仅有一个元素的情况。

public class Solution {
public int findMin(int[] num) { int left = 0;
int right = num.length - 1; while(left < right)
{
if(num[left] < num[right]) {
return num[left];
} int mid = left + (right-left)/2;
if(num[left] <= num[mid]) {
left = mid + 1;
} else {
right = mid;
}
}
return num[left];
}
}

http://orzorz.me/learn/lesson.htm?lessonId=106

递归

Thoughts:

  1. If the array just has one element, then return the element.
  2. If the array has two elements, then return the smaller one.
  3. If the left most element is smaller than the right most element, then we can know the array is sorted like never be rotated. Just return the left one.
  4. By the method of Binary Search, we get the middle element of array, a[mid]. If a[mid] > a[left], then the left half of array is sorted. we then search the right half, including a[mid]. Otherwise we search the left half, including a[mid].

public class Solution {
public int findMin(int[] A) {
return helper(A, 0, A.length-1);
} public static int helper(int[] a, int left, int right){
//one element
if(left == right){
return a[left];
} //two elements
if(left == right-1){
return a[left]<a[right]? a[left]: a[right];
} //the array is ordered
if(a[left] < a[right]){
return a[left];
} int mid = (left+right)/2; if(a[mid] >= a[left]){
return helper(a, mid, right);
}else{
return helper(a, left, mid);
} }
}

https://chesterli0130.wordpress.com/2012/10/20/finding-the-minimum-in-a-sorted-rotated-array/

Find Minimum in Rotated Sorted Array 旋转数组中找最小值 @LeetCode的更多相关文章

  1. Find Minimum in Rotated Sorted Array(旋转数组的最小数字)

    题目描述: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., might become ...

  2. 153 Find Minimum in Rotated Sorted Array 旋转数组的最小值

    假设一个按照升序排列的有序数组从某未知的位置旋转.(比如 0 1 2 4 5 6 7 可能变成 4 5 6 7 0 1 2).找到其中最小的元素.你可以假设数组中不存在重复的元素.详见:https:/ ...

  3. 33. Search in Rotated Sorted Array旋转数组二分法查询

    一句话思路:反正只是寻找一个最小区间,断开也能二分.根据m第一次的落点,来分情况讨论. 一刷报错: 结构上有根本性错误:应该是while里面包括if,不然会把代码重复写两遍,不好. //situati ...

  4. 【LeetCode】Search 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 ...

  5. LeetCode Find Minimum in Rotated Sorted Array 旋转序列找最小值(二分查找)

    题意:有一个有序序列A,其内部可能有部分被旋转了,比如A[1...n]被转成A[mid...n]+A[1...mid-1],如果被旋转,只有这种形式.问最小元素是?(假设没有重复元素) 思路:如果是序 ...

  6. LeetCode(154) Find Minimum in Rotated Sorted Array II

    题目 Follow up for "Find Minimum in Rotated Sorted Array": What if duplicates are allowed? W ...

  7. [LeetCode] Find Minimum in Rotated Sorted Array II 寻找旋转有序数组的最小值之二

    Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed? Would ...

  8. [LeetCode] 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 migh ...

  9. [Swift]LeetCode154. 寻找旋转排序数组中的最小值 II | Find Minimum in Rotated Sorted Array II

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

随机推荐

  1. 《3+1团队》【Alpha】Scrum meeting 4

    项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 3+1团队 团队博客地址 https://home.cnblogs.com/u/3-1group ...

  2. Vue之组件的使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. java 数据库(二)

    1.SQL概述 1.什么是SQL(了解): 结构化查询语言,是一种功能齐全的数据库语言.在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的 SQL被美国国家标准局(ANSI)确定为关 ...

  4. 【2018 CCPC网络赛】1001 - 优先队列&贪心

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6438 获得最大的利润,将元素依次入栈,期中只要碰到比队顶元素大的,就吧队顶元素卖出去,答案加上他们期中 ...

  5. 去BAT,你应该要看一看的面试经验总结

    我去年12月份从上一家公司离职,一直到今年3月份,基本上都在面试中度过来的. 先交代下背景:坐标上海,做技术开发,我本人面试的职位是linux服务器开发,最倾向的职位是服务器开发主程或技术经理.我本人 ...

  6. 全新Ubentu系统没有make,gcc命令解决办法

    一定要记得先update sudo apt-get update 然后输入下述命令即可 sudo apt-get install make sudo apt-get install gcc

  7. 从多表连接后的select count(*)看待SQL优化

    从多表连接后的select count(*)看待SQL优化 一朋友问我,以下这SQL能直接改写成select count(*) from a吗? SELECT COUNT(*) FROM a LEFT ...

  8. 【Java IO流】浅谈io,bio,nio,aio

    本文转载自:http://www.cnblogs.com/doit8791/p/4951591.html 1.同步异步.阻塞非阻塞概念        同步和异步是针对应用程序和内核的交互而言的. 阻塞 ...

  9. 条款19:设计class犹如设计TYPE(Treat class design as type design)

    NOTE: 1.Class 的设计就是type的设计.在定义一个新type之前,请确认自己已经考虑过本条款所有主题(具体参考effective c++).

  10. 《算法导论》— Chapter 11 散列表

    1 序 在很多应用中,都要用到一种动态集合结构,它仅支持INSERT.SEARCH以及DELETE三种字典操作.例如计算机程序设计语言的编译程序需要维护一个符号表,其中元素的关键字为任意字符串,与语言 ...