旋转数组的最小值

旋转数组的最小值

所谓旋转数组,即是递增有序数组旋转右移动若干位得到的数组,这里的右移和java里的>>>有点不同,像是汇编里的那个移动,流水灯的那个移动
比如:

1,2,3,4,5,6---->4,5,6,1,2,3

因为这个可以是看成是已经有序的递增数组,所以可以用二分法,

  1. 选定一个中间数,若右边的数小于中间数,说明那个最小的数字应该处于中间的数字到右边的那个数字之间。包括边界的两个数字;

  2. 选定一个中间数,如果左边的数字大于中间的数字,说明最小的的那个数字应该在处于左边的数字到中间的数字之间。
  3. 情况3就比较奇葩了,如这个数组{5,1,2,3,5,5,5,5,5,5,5}
    第一次取的中间值是5,然后他和左边和右边的值都是一模一样的,导致根本就不知道是属于情况1还是2,所以这个时候就只能暴力遍历了。。当然暴力遍历也不能放弃之前筛选的成果,所以加上了左右边界。
public static int findSmallestNumber(int[] array){
        //左边界的下标
        int left = 0;
        //右边界的下标
        int right = array.length - 1;
        
        for(int i = array.length ; i > 0 ; i = i / 2){
            int middle = array[(left + right) / 2];
            //情况1
            if(array[right] < middle){
                left = (left + right) / 2;
            //情况2
            }else if(array[left] > middle){
                right = (left + right) / 2;
            }else{
                //这里就是情况3
                return minInOrder(array, left, right);
            }
               //最后当左右只差1的时候,最小的就是两者其一
            if(right - left == 1){
                if(array[right] > array[left]){
                    return array[left];
                }else{
                    return array[right];
                }
            }
        }
        return -1;
    }
    
    private static int minInOrder(int[] array , int left , int right){
        int min = array[left];
        for(int i = left + 1; i <= right ; i++){
            if(array[i] < min){
                min = array[i];
            }
        }
        return min;
    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 声明: 本总结仅为个人学习总结,以防止遗忘而作,不得转载和商用。 问题描述假定一个排序数组(已经有序) 以某个未知...
    春天还没到阅读 523评论 0 0
  • 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出...
    莫小西0213阅读 99评论 0 0
  • 旋转数组的最小数字 题目 给定一个递增的旋转数组A,返回旋转数组中的最小值。旋转数组:给定一个已排序的数组,假设为...
    蓝雪冬荷阅读 469评论 0 0
  • 1.阅读 原文:佛陀教导我们,当我们进食的时候,不要容许自己在思绪与交谈中迷失。我们应该安住当下,深深地感受食物以...
    寅颖阅读 265评论 0 0
  • 九型人格 今天讲的是九型人格—提升情商的秘诀,这是一个比较大是问题,也是不交重要的话题。 那接下来告诉大家九型是什...
    a5d587239395阅读 1,241评论 0 2