*劍指Offer題目8:旋轉數組的最小數字(Java)

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

牛客網 OJ:旋轉數組的最小數字算法

解題思路

1. brute force

for 循環遍歷,效率低,時間複雜度是 O(n)

2. 二分法

旋轉以後的數組分爲兩個子數組,前main的數組大於等於後面子數組的元素。

並且,最小的元素恰好是兩個子數組的分界線。

所以能夠用二分查找,時間複雜度降爲 O(log n)。
複製代碼

代碼實現

1、for 循環遍歷(brute force)數組

public class Solution {
    public int minNumberInRotateArray(int [] array) {
        if(array == null || array.length == 0) {
            return 0;
        }
        for(int i = 0; i<= array.length; i++) {
            if(array[i] > array[i+1]){
                return array[i + 1];
            } 
        }
        return array[0];
    }
}
複製代碼

2、二分法查找bash

public class Solution {
    public int minNumberInRotateArray(int [] array) {
        if(array == null || array.length == 0) {
            return 0;
        } 
        int low = 0, high = array.length - 1;
        while(low < high) {
            int mid = low + (high - low) / 2;
            if(array[mid] > array[high]) { //說明分界線最小值在 mid 下標以後
                low = mid + 1;
            } else if(array[mid] < array[high]) { //說明分界線最小值在 mid 下標以前
                high = mid;//注意,這裏有可能剛恰好和 mid 重合
            } else {
                high --;//如[2,2,1,2] 此時m=1, a[m] = 2 == a[h], h--, 末端下標往前移動一位
            }
        }
        return array[low];
    }
    
}
複製代碼

總結

要求:重點掌握二分查找、歸併排序和快速排序,作到可以隨時正確、完整地寫出它們的代碼。數據結構

查找和排序

查找相對而言比較簡單,不外乎順序查找、二分查找、哈希表查找和二叉樹查找。ui

要求:信手拈來寫出完整的二分查找代碼,這是對面試官起碼的尊重。spa

若是面試題要求在排序的數組中查找一個數字,或者統計某個數字出現的次數,咱們均可以嘗試用二分查找算法。code

哈希表 和 二叉排序樹查找的重點在於考察對應的數據結構,而不是算法。排序

哈希表的優勢:在 O(1) 時間內查找到某一元素,是效率最高的查找方式。get

排序比查找複雜。

要求:比較插入排序、冒泡排序、歸併排序、快速排序等不一樣算法的優劣。

必定要對各類排序算法的特色爛熟於心,須要掌握如下幾點:

額外空間消耗、平均時間複雜度和最差時間複雜度等方面去比較這些排序算法的優缺點。

其中,快排是最常常面到的。

相關文章
相關標籤/搜索