算法學習-旋轉數組的最小數字(Java實現)

題目概述

 

把一個數組最開始的若干個元素搬到數組的末尾,我們稱之爲數組的旋轉。
輸入一個非遞減排序的數組的一個旋轉,輸出旋轉數組的最小元素。
例如數組{3,4,5,1,2}爲{1,2,3,4,5}的一個旋轉,該數組的最小值爲1。
NOTE:給出的所有元素都大於0,若數組大小爲0,請返回0。

 

原題:https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId=13&tqId=11159&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

 

 

考察點

數組、二分法

 

時間複雜度

O(logn)

 

實現思路

  • 根據題意說明是一個遞增數組的旋轉,所以如題所示【3,4,5】,【1,2】還是局部遞增的,在這種的數組中查找,一般選擇二分的方法;基本模型有了,下面試着分析:

  • 1.先取出中間的數值,和最後一個比較5>2 說明mid之前的某些部分旋轉到了後面,所以下次尋找 start = mid+1 開始;

  • 2.取出的中間值要是小於end,說明mid-end之間都應爲被旋轉的部分,所以最小應該在mid的前面,但是也有可能當前的mid 就是最小的值 所以下次需找的應該 從mid開始,也即end = mid 開始

  • 3.當mid == end的時候,說明數組中存在着相等的數值,可能是這樣的形式 【2,2,2,2,1,2】所以應該選擇的end 應該遞減1 或者begin加1作爲下次尋找的上界。

 

Java代碼(可以直接複製使用)

public class MinNumberInRotateArray {
    public int minNumberInRotateArray(int[] array) {

        int left = 0;
        int right = array.length - 1;

        while (left < right) {
            int mid = (left+right) / 2;
            if (array[mid] > array[right]) {
                left = mid + 1;
            } else if (array[mid] < array[right]) {
                right = mid ;
            } else {
                right = right - 1;
            }

        }

        return array[left];
    }
}

 

有問題的小夥伴可以在下方留言哦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章