关闭

剑指offer--旋转数组的最小数字

标签: 剑指offer-java实现牛客网在线编程
400人阅读 评论(0) 收藏 举报
分类:

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。


分析:
这道题最直观的解法并不难。从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N)。但这个思路没有利用输入数组的特性,我们应该能找到更好的解法。
我们注意到旋转之后的数组实际上可以划分为两个排序的子数组,而且前面的子数组的元素都大于或者等于后面子数组的元素。我们还可以注意到最小的元素刚好是这两个子数组的分界线。我们试着用二元查找法的思路在寻找这个最小的元素。
首先我们用两个指针,分别指向数组的第一个元素和最后一个元素。按照题目旋转的规则,第一个元素应该是大于或者等于最后一个元素的(这其实不完全对,还有特例。后面再讨论特例)。
接着我们得到处在数组中间的元素。如果该中间元素位于前面的递增子数组,那么它应该大于或者等于第一个指针指向的元素。此时数组中最小的元素应该位于该中间元素的后面。我们可以把第一指针指向该中间元素,这样可以缩小寻找的范围。同样,如果中间元素位于后面的递增子数组,那么它应该小于或者等于第二个指针指向的元素。此时该数组中最小的元素应该位于该中间元素的前面。我们可以把第二个指针指向该中间元素,这样同样可以缩小寻找的范围。我们接着再用更新之后的两个指针,去得到和比较新的中间元素,循环下去。
按照上述的思路,我们的第一个指针总是指向前面递增数组的元素,而第二个指针总是指向后面递增数组的元素。最后第一个指针将指向前面子数组的最后一个元素,而第二个指针会指向后面子数组的第一个元素。也就是它们最终会指向两个相邻的元素,而第二个指针指向的刚好是最小的元素。这就是循环结束的条件。


代码如下:

public class Solution {

    public int minNumberInRotateArray(int [] array) {
        if ( array == null || array.length < 1){
            return -1;
        }
        int len = array.length;
        int low = 0;
        int high = len - 1;
        int mid = (low + high) / 2;

        //如果首个元素小于最后一个元素,表明数组是排序的。 
        if (array[low] < array[high]){
            return array[low];
        }

        //当low指针与high指针相邻的时候,high指针指向的就是最小元素  
        if ( high - low == 1){
            return array[high];
        }

        while(low < high){
            mid = ( low + high) / 2;
            if(mid==low){//if there are only two elements left  
                return (array[low] < array[high])? array[low] : array[high];  
            }  
            if ( array[mid] >= array[low]){  
                low = mid;
            }else if ( array[mid] <= array[high]){
                high = mid;
            }
        }
        return array[mid];
    }
}
0
0
查看评论

剑指offer--旋转数组的最小数字

题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 import java.util.ArrayList; publi...
  • kangaroo835127729
  • kangaroo835127729
  • 2015-04-10 23:21
  • 429

旋转数组的最小数字 python

题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 ...
  • XiaoXIANGZI222
  • XiaoXIANGZI222
  • 2017-02-18 20:42
  • 795

剑指Offer面试题8(java版):旋转数组的最小数字

题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为旋转。 输入一个递增的排序的数组的一个旋转,输出旋转数组的最小元素。  例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小元素为1. 这道题最直观的解法并不难,从头到尾遍历一次...
  • jsqfengbao
  • jsqfengbao
  • 2015-07-28 17:26
  • 1983

剑指offer--面试题8:旋转数组的最小数字--Java实现

题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。解题思路: 1.暴力解法,遍历一遍就能找到最小的值,复杂度为O(n),但是...
  • u012289407
  • u012289407
  • 2015-05-06 21:14
  • 579

面试题8:旋转数组中的最小数字

旋转数组的特点: (1)递增排序的数组旋转之后的数组可划分为两个排序的子数组; (2)前面的子数组的元素都大于或等于后面子数组的元素; (3)最小的元素刚好是两个子数组的分界线; (4)旋转数组在一定程度上是有序的;        在有序...
  • htyurencaotang
  • htyurencaotang
  • 2013-07-19 22:56
  • 4218

剑指offer--面试题11:旋转数组的最小数字

#include #include using namespace std; int MinInOrder(int *a,int low,int high) { int result=a[low]; for(int i=low+1;i<=high;++i) { if(result&...
  • u010726692
  • u010726692
  • 2017-07-07 20:07
  • 90

剑指offer第六题【旋转数组的最小数字】c++实现

旋转数组的最小数字 参与人数:3258时间限制:1秒空间限制:32768K通过比例:14.10%最佳记录:0 ms|0K(来自  Wocao) 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减序列的一个旋转,输出...
  • u011692312
  • u011692312
  • 2015-10-14 11:30
  • 417

剑指offer--面试题8: 旋转数组的最小数字

题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 pytho...
  • qingyujean
  • qingyujean
  • 2016-09-26 13:37
  • 177

剑指offer----旋转数组的最小数字----java实现

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 如果直接遍历数...
  • snow_7
  • snow_7
  • 2016-07-14 15:34
  • 1579

剑指offer-6.旋转数组的最小数字

题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 思路:题目...
  • I_love_blog
  • I_love_blog
  • 2017-04-23 15:01
  • 84
    个人资料
    • 访问:155568次
    • 积分:4927
    • 等级:
    • 排名:第6843名
    • 原创:329篇
    • 转载:0篇
    • 译文:0篇
    • 评论:80条
    博客专栏
    最新评论