lintcode練習 75 尋找峰值

2021-08-27 08:28:04 字數 1227 閱讀 1606

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

假定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)

怎麼用二分法呢?猛地想不到,就先想想left和right求取中值mid嘛,這是二分法的通用套路。然後,此時mid所指向的元素的值就分為三種情況了:

1. a[mid] > a[mid + 1] && a[mid] > a[mid - 1],那麼,根據定義,mid指向的就是乙個峰值

2. a[mid] < a[mid + 1],因為a[n - 2] > a[n - 1],那麼,一定有乙個峰值存在於[mid + 1, n - 2]

3. a[mid] < a[mid - 1],因為a[0] < a[1],那麼,一定有乙個峰值存在於[1, mid - 1]

也就是說,我們每次求得mid所指的值,都可以縮減峰值存在的範圍。

class solution:

"""@param a: an integers array.

@return: return any of peek positions.

"""def findpeak(self, a):

# write your code here

#根據資料特點直接判斷

if a[1] > a[2]:

return 1

if a[len(a)-2] > a[len(a) - 3]:

return len(a) - 2

start, end = 0, len(a) - 1

while start <= end:

mid = (start + end) // 2

if a[mid] > a[mid+1] and a[mid] > a[mid -1]:

return mid

if a[mid] < a[mid + 1]:

start = mid + 1

else:

end = mid - 1

return start if a[start] >= a[end] else end

兩次過 Lintcode 75 尋找峰值

你給出乙個整數陣列 size為n 其具有以下特點 假定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 普通遍...

7 5 尋找大富翁

胡潤研究院的調查顯示,截至2017年底,中國個人資產超過1億元的高淨值人群達15萬人。假設給出n個人的個人資產值,請快速找出資產排前m位的大富翁。輸入格式 輸入首先給出兩個正整數n 10 6 和m 10 其中n為總人數,m為需要找出的大富翁數 接下來一行給出n個人的個人資產值,以百萬元為單位,為不超...

尋找重複的數 LintCode

給出乙個陣列 nums 包含 n 1 個整數,每個整數是從 1 到 n 包括邊界 保證至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。注意事項 不能修改陣列 假設陣列只能讀 只能用額外的o 1 的空間 時間複雜度小於o n 2 陣列中只有乙個重複的數,但可能重複超過一次 樣例 給出...