• 旋转数组的最小数字


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

    例如数组{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;
        }
  • 相关阅读:
    jquery 根据 option 的 text 定位选中 option
    Mac 打开任务管理器 关闭程序
    什么是 IaaS、PaaS、SaaS
    网站 A/B Test
    PHP 设计模式之策略模式
    mybatis-plus的使用 ------ 入门
    IEDA和svn上同步及更新代码【我】
    springBoot 项目测试【我】
    Idea检出项目配置【我】
    IDEA常用的风格设置
  • 原文地址:https://www.cnblogs.com/yingpu/p/5813427.html
Copyright © 2020-2023  润新知