1. 程式人生 > >lintcode_75.尋找峰值

lintcode_75.尋找峰值

nbsp 區間 list positions ger style div span while

你給出一個整數數組(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 所在位置.

題意實際應該是找任意一個極大值

class Solution:
    """
    @param: A: An integers array.
    @return: return any of peek positions.
    
""" def findPeak(self, A): # write your code here if len(A)<2: return A
for i in range(1,len(A)-1): if (A[i+1]-A[i]) < 0: return i

時間復雜度O(n),Time Limit Exceeded

考慮二分法,九章參考:

class Solution:
    #@param A: An integers list.
#@return: return any of peek positions. def findPeak(self, A): # write your code here start, end = 1, len(A) - 2 while start + 1 < end: mid = (start + end) / 2 if A[mid] < A[mid - 1]: end = mid elif A[mid] < A[mid + 1]: start
= mid else: end = mid #直接return mid就行,不用再找了 if A[start] < A[end]: return end else: return start

一開始覺得不對,仔細審題發現還有約束

  • A[0] < A[1] 並且 A[n - 2] > A[n - 1]

只用考慮中間點局部範圍則可以找到某峰值的區間。

lintcode_75.尋找峰值