11、旋转数组的最小数字

1、题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

2、思路:旋转数组找最小,其实就是将原来的递增数组查找变了个型。还是要紧紧抓住数组有序的特点,依然借鉴二分查找的方式来进行,二分查找可以用迭代或者循环均可实现。

(1)对比中间元素和头尾元素的大小,

若中间元素>头元素,则说明中间元素位于递增部分,那么最小元素一定位于后半部分。将头指针移向中间元素;

若中间元素<头元素,则说明中间元素位于递减部分,那么最小元素一定位于前半部分。将尾指针移向中间元素;

迭代的终止条件,指针指向两个相邻元素,第二个元素就是最小元素。

此时,还需要考虑两个特例:

第一个特例:旋转数组实际上没发生旋转,把0个元素挪到了后面。这时候的判定条件就是头元素小于最后一个元素,头元素就是最小元素。其实这种方式

第二个特例:中间元素=头元素,如:01111 旋转数组11101、10111,这时候就不知道到底该取哪半部分了。所以只能用遍历的方式取最小值。

3、代码://TODO利用书上思想实现一个。

public class Solution {
    public int minNumberInRotateArray(int [] array) {
        int low = 0 ;
        int high = array.length - 1;   
        while(low < high){
            int mid = low + (high - low) / 2;        
            if(array[mid] > array[high]){
                low = mid + 1;
            }else if(array[mid] < array[high]){
                high = mid;
            }else{
                //当中间数、第一个指针数、第二指针数,三个数相等的时候,用顺序查找
                high = high - 1;
            }   
        }
        return array[low];
    }
}

猜你喜欢

转载自www.cnblogs.com/guoyu1/p/12058310.html
今日推荐