1. 程式人生 > >[lintcode] 75.尋找峰值 [Medium]

[lintcode] 75.尋找峰值 [Medium]

描述

你給出一個整數陣列(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)

思路

看到O(logN)就知道應該是二分查詢。感覺這個和找中位數差不多,只是需要每次減少一半的搜尋域就可以了。關鍵是隻需要找到一個,所以思路是“這個方向肯定有”(而其他方向也可能有)。

程式碼

class Solution {
public:
    /**
     * @param A: An integers array.
     * @return: return any of peek positions.
     */
    int findPeak(vector<int> &A) {
        // write your code here
        int start = 0, end = A.size()-1;
        int mid = (start+end)/2;
        int n=A.size()-1;
        
        
        while(start <= end && mid >= 1 && mid <= n-2)
        {

            if(A[mid] > A[mid-1] && A[mid] > A[mid+1])
            {
                return mid;
            }
            else if(A[mid] <= A[mid-1])
            {
                end = mid-1;
            }
            else
            {
                start = mid+1;
            }
            
            mid = (start+end)/2;
        }
        
        return n-1;
        
    }
};