【兩次過】Lintcode 75. 尋找峰值
阿新 • • 發佈:2018-12-24
你給出一個整數陣列(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; } }