1. 程式人生 > >【兩次過】Lintcode 75. 尋找峰值

【兩次過】Lintcode 75. 尋找峰值

你給出一個整數陣列(size為n),其具有以下特點:

  • 相鄰位置的數字是不同的
  • A[0] < A[1] 並且 A[n - 2] > A[n - 1]

假定P是峰值的位置則滿足A[P] > A[P-1]A[P] > A[P+1],返回陣列中任意一個峰值的位置。

樣例

給出陣列[1, 2, 1, 3, 4, 5, 7, 6]返回1, 即數值 2 所在位置, 或者6, 即數值 7 所在位置.

挑戰

Time complexity O(logN)

注意事項

  • It's guaranteed the array has at least one peak.
  • The array may contain multiple peeks, find any of them.
  • The array has at least 3 numbers in it.

解題思路:

普通遍歷方法會超時。所以這裡採用二分搜尋法,如果中間的數就是峰值直接返回,如果中間的數比前一位數小的話,peek點肯定在mid右邊,如果中間的數比後一位數大的話,peek點肯定在mid左邊

public class Solution {
    /**
     * @param A: An integers array.
     * @return: return any of peek positions.
     */
    public int findPeak(int[] A) {
        // write your code here
        int l = 1, r = A.length-2; 
        
        while(l <  r) {
            
            int mid = (l + r) / 2;

            if(A[mid] > A[mid-1] && A[mid] > A[mid+1])
                return mid;
            else if(A[mid] < A[mid - 1]) //如果中間的數比前一位數小的話,peek點肯定在mid右邊
                r = mid;
            else                        //如果中間的數比後一位數大的話,peek點肯定在mid左邊
                l = mid + 1;
        }
        
        return l;
    }
    

}