LeetCode算法題-Peak Index in a Mountain Array(Java實現)

這是悅樂書的第329次更新,第352篇原創

01 看題和準備

今天介紹的是LeetCode算法題中Easy級別的第199題(順位題號是852)。如果以下屬性成立,我們將數組A稱爲山:

  • A.length> = 3。

  • 存在一個i(0 < i < A.length-1),使得A[0] <A[1] <... A[i-1] < A[i] > A[i + 1]> ...> A[A.length - 1]。

給定一個絕對是山的數組,返回i,使得A[0] <A[1] <... A[i-1] <A[i]> A[i + 1]> ...> A [A.length - 1]。例如:

輸入:[0,1,0]

輸出:1


輸入:[0,2,1,0]

輸出:1


注意

  • 3 <= A.length <= 10000

  • 0 <= A [i] <= 10 ^ 6

  • 如上所述,A是一座山。

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

02 第一種解法

數組A是座山的意思是指,數組A中的元素大小排列像山的形狀一樣,由低處到山頂,再由山頂到低處,而題目要求我們找的那個i就是山頂所在位置的索引,而題目給出的條件是,數組A肯定是一座山,所以可以直接使用遍歷數組元素的方式,從第一位元素開始,往後比較,小於就繼續往後,直到當前元素大於它的後一個元素,表示此元素就是山頂了,直接返回該元素索引即可。

public int peakIndexInMountainArray(int[] A) {
    int n = A.length;
    for (int i=0; i<n-1; i++) {
        if (A[i] < A[i+1]) {
            continue;
        } else {
            return i;
        }
    }   
    return 0;
}


03 第二種解法

思路和上面一樣,也是直接遍歷數組元素,進行比較,找到山頂。

public int peakIndexInMountainArray(int[] A) {
    int index = 0;
    while (A[index] < A[index+1]) {
        index++;
    }
    return index;
}


03 第三種解法

上面兩種解法的時間複雜度都是O(N),我們還可以使用二分查找法,將時間複雜度降低爲O(logN)。定義兩個變量left、right,一個從0開始,一個從數組最後一位開始,每次取兩者中間值,得到該中間位置的元素,然後和它的前一個元素比較大小,如果小於,說明還沒有到山頂,需要繼續向前,將中間值加1後賦值給left,反之就將中間值賦值給right。循環結束的條件是left不小於right,最後返回left即可。

public int peakIndexInMountainArray(int[] A) {
    int left = 0, right = A.length-1;
    while (left < right) {
        int mid = left + (right-left)/2;
        if (A[mid] < A[mid+1]) {
            left = mid+1;
        } else {
            right = mid;
        }
    }
    return left;
}


04 小結

算法專題目前已日更超過五個月,算法題文章199+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!

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