旋转数组的最小数字(Java)

旋转数组的最小数字(Java)

题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0
常规解法
最常规的解法是顺序查找,从头到尾遍历一边数组就可以得到最小元素了,这种思路的时间复杂度显然就是O(n)

import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) {
        if(array.length==0)
            return 0;
        for(int i =1;i<array.length-1;i++){
            if(array[i]<array[i-1])
                return array[i]<array[0]?array[i]:array[0];
        }
        return array[0];
    }
}

二分解法:
可以发现旋转后的数组实际可以划分成两个排序的子数组,而且前面的子数组的元素都大于或者等于后面子数组的元素,同时我们可以发现最小的元素刚好是这两个子数组的分界线。在有序的数组中我们可以使用二分查找法来查找最小的元素,该方法的时间复杂度为O(log n)

注意:
1:将排序数组的前面的0个元素搬到后面,即排序数组本身任然是一个反转,例如数组{1,2,3,4,5},第一个元素就是最小值
2:如果旋转数组为{1,0,1,1,1},是{0,1,1,1,1}的旋转,这种情况下,第一个指针指向的元素等于第二个指针指向的元素等于中间元素,如果继续用上述解决方法则会出现问题,因为此时我们无法判断中间元素是属于前面递增子数组还是属于后面递增子数组。这种情况下就需要对采用顺序查找

 publicc int minNumberInRotateArray(int [] array) {
        int index1=0;//指向数组第0个元素
        int index2=array.length-1;//指向数组最后一个元素
        int indexMid=index1;//用来处理第一种特殊情况
        while(array[index1]>=array[index2])
        {
            if(index2-index1==1)//查找结束条件
            {
                indexMid=index2;
                break;
            }
            indexMid=(index1+index2)/2;//找到中间元素的下标
            //用来处理第二种特殊情况
            if(array[index1]==array[index2]&&array[index2]==array[indexMid])
            {
                return minInOrder(array,index1,index2);
            }
            //当中间元素大于等于第一个指针指向的元素
            if(array[indexMid]>=array[index1])
            {
                index1=indexMid;
            }
            //当中间元素小于等于第二个指针指向的元素
            else if(array[indexMid]<=array[index2])
            {
                index2=indexMid;
            }
        }
        return indexMid;
    }
    //第二种特殊情况的处理,就是采用顺序查找,通过遍历数组来查找最小值
    public int minInOrder(int[] array,int index1,int index2)
    {
        int result=array[index1];
        for(int i=index1;i<=index2;i++)
        {
            if(result>array[i])
            {
                result=array[i];
            }
        }
        return result;
    }

发布了20 篇原创文章 · 获赞 0 · 访问量 232
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览