旋转数组的最小数字

Posted ohana!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了旋转数组的最小数字相关的知识,希望对你有一定的参考价值。

题目要求: 

 

分析:

一,暴力解法

对于暴力解法其实也就是一次循环遍历,直到找到最小的那个数,是可以解决问题,但是,显然不符合时间复杂度的要求

二,双指针法

由题目可以知道,其实,旋转数组也有规律,就是两个递增数组拼接在了一起,构成了一个非递减的数组,因此,考虑使用双指针法进行遍历,对于这个题目来说,是可以的,但是,如果, 运气比较差,最小的元素在最后一个位置,也就是旋转程度很深,那么时间复杂度和暴力解法无异,因此不考虑使用 

三,二分查找

这一个题目最理想的方式就是二分查找,时间复杂度也不高,具体分析,详见代码 

import java.util.ArrayList;
public class Solution 
    public int minNumberInRotateArray(int [] array) 
        /*
        因为题目中已经说了,数据范围,可以不用进行判空
        定义左值为:left = 0
        右值为:right = array.length - 1
        */
        int left = 0;
        int right = array.length - 1;
        int mid = 0;
        while(left < right)
            /*
            这是一个重要的判断手段,由于是两个递增数组构成的非递减数组
            一旦,最左边的值比最右边的小,说明,此时,已经到达了一个递增的数组当中
            此时可以直接返回array[left]
            */
            /*
            为什么此时的left一定是最小元素的下标?
            这个很简单,不是最小的,肯定还在下面循环,left处的元素指定是大于right处的
            我们的left也是mid + 1 的形式不断递增,如果一直是在第一个判断语句中
            只能说明,最小的元素一定在右边
            */
            if(array[left] < array[right])
                return array[left];
            
            mid = (left + right) >> 1;
            if(array[mid] > array[right])
                //mid参与了比较,直接使用下一个,需要改变left
                left = mid + 1;
            else if(array[mid] < array[right])
                //mid未参与比较,right需要改变
                right = mid;
            else
                //相等的情况下,缩小right或者right都可以
                left++;
            
        
        return array[left];
    

以上是关于旋转数组的最小数字的主要内容,如果未能解决你的问题,请参考以下文章

旋转数组的最小数字

剑指:旋转数组的最小数字

旋转数组的最小数字

旋转数组的最小数字

旋转数组的最小数字

最强解析面试题:旋转数组的最小数字