作者:Grey
原文位址: LeetCode 162. Find Peak Element
題目連結
假設數組長度為<code>N</code>,首先判斷<code>0</code>号位置的數和<code>N-1</code>位置的數是不是峰值位置。
<code>0</code>号位置隻需要和<code>1</code>号位置比較,如果<code>0</code>号位置大,<code>0</code>号位置就是峰值位置。
<code>N-1</code>号位置隻需要和<code>N-2</code>号位置比較,如果<code>N-1</code>号位置大,<code>N-1</code>号位置就是峰值位置。
如果<code>0</code>号位置和<code>N-1</code>在上輪比較中均是最小值,那麼數組的樣子必然是如下情況:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SN0QTMyUDOxEjMtkzNzADM5AzMycjM3ATMyAjMtYDMyMDO28CX3ATMyAjMvwlNwIzM4YzLcd2bsJ2Lc12bj5ycn9Gbi52YuAjMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
<code>[0..1]</code>區間内是增長, <code>[N-2...N-1]</code>區間内是下降
那麼峰值位置必在<code>[1...N-2]</code>之間出現
此時可以通過二分來找峰值位置,先來到中點位置,假設為<code>mid</code>,如果:
則<code>mid</code>位置即峰值位置
否則,有如下兩種情況:
情況一,趨勢是:
則在<code>[1...(mid-1)]</code>區間内繼續上述二分。
情況二,趨勢是:
則在<code>[(mid+1)...(N-2)]</code>區間内繼續上述二分。
算法和資料結構筆記