zoukankan      html  css  js  c++  java
  • 旋转数组的最小数字

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。

    例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

    第一种思路是:从数组的第一个元素开始看,找到第一个前一个元素比后一个元素大的下标,返回下标值+1所对应的数组元素中的值。时间复杂度:O(n)

    public int getMin(int[] array){
            int i=0;
            for(;i<array.length;i++){
                if(array[i]>array[i+1]){
                    break;
                }
            }
            return array[i+1];
        }

    第二种思路是:运用二分查找的思路来做这件事。先找到数组的中间值,然后和数组的第一个和最后一个元素比较,通常第一个元素都是大于最后一个元素的,若中间元素值大于前面的元素,则最小值肯定在后面的部分,将前面的下标赋给中间小标,若中间的元素值比后面的元素值小,则将后面的元素值赋值给中间的元素。最后,中间的元素值可能等于前面的元素,也可能等于后面的元素,此时,不能判定最小值是在哪一部分,所以需要用顺序法,从头开始判断,找到最小的值。

    public int minNumberInRotateArray(int [] array) {
            if(array[0]<array[array.length-1] || array.length==1){
                return array[0];
            }
            int n = array.length;
            int low = 0;
            int high = n-1;
            while(high-low!=1){
                int mid = low+(high-low)/2;
                if(array[mid] == array[low] && array[mid] == array[high]){
                    return getShunxu(array);
                }
                if(array[mid]>=array[low]){
                    low = mid;
                }else{
                    high = mid;
                }
            }
            return array[high];
        }
        public int getShunxu(int[] array){
            int min = array[0];
            for(int i=1;i<array.length;i++){
                if(array[i]<min){
                    min = array[i];
                }
            }
            return min;
        }
  • 相关阅读:
    P2824 [HEOI2016/TJOI2016]排序
    P4930「FJ2014集训」采药人的路径
    FlexboxLayout 的一些基本介绍与基本用法
    Android——打造万能适配器(CommonAdapter)
    关于list、set、map的几点总结
    equals()和hashCode()区别?
    Android开发艺术探索(一)——Activity的生命周期和启动模式
    Android开发艺术探索(三)——View的事件体系
    Android五大布局重新回顾
    Android基础知识回顾
  • 原文地址:https://www.cnblogs.com/yingpu/p/5813427.html
Copyright © 2011-2022 走看看