1. 程式人生 > >leetcode.852 山脈陣列的峰頂索引

leetcode.852 山脈陣列的峰頂索引

我們把符合下列屬性的陣列 A 稱作山脈:

  • A.length >= 3
  • 存在 0 < i < A.length - 1 使得A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1]

給定一個確定為山脈的陣列,返回任何滿足 A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1] 的 i

 的值。

 

示例 1:

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

示例 2:

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

提示:

  1. 3 <= A.length <= 10000
  2. 0 <= A[i] <= 10^6
  3. A 是如上定義的山脈

思路一:遍歷得出下陣列中最大的數,並返回其下標。

程式碼:

class Solution {
    public int peakIndexInMountainArray(int[] A) {
        int max = A[0];
        int a = -1;
        for(int i = 1; i < A.length; i++){
            if(A[i] > max) {
                max = A[i];
                a = i;
            }
        }
        return a;
    }
}

思路二:利用二分的思想,從 0 到 A.length - 1 遍歷並判斷:如果得出的 mid 中位數的值大於左邊的數,而小於右邊的數,就將區間變為 mid ~ A.length-1,不然的話就是在 0 ~ mid 中繼續找,知道找到 mid 的值大於前一個數和後一個數。

程式碼:

class Solution {
    public int peakIndexInMountainArray(int[] A) {
        return find(0, A.length-1, A);
    }
    
    private int find( int i, int j, int[] A ){
        int mid = (i+j)/2;
        if( A[mid-1] < A[mid]  && A[mid] < A[mid+1]){
            return find(mid, j, A);
        }else if( A[mid-1] < A[mid]  && A[mid] > A[mid+1] ){
            return mid;
        }else{
            return find(i, mid, A);
        }
    }
    
}