↓快轉到主要內容
  1. LeetCode/

LeetCode 162: Find Peak Element

·1 分鐘· ·
LeetCode Medium Array Binary-Search
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2022-11-11

  • 提交紀錄:Runtime Error → Wrong Answer → Runtime Error → Accepted → Runtime Error → Accepted ×2 → Wrong Answer → Accepted

解題思路
#

陣列兩端外面都當成負無限大(Binary Search)。看 mid 和 mid + 1:

  • nums[mid] < nums[mid + 1]:往右是上坡,右邊一定有山峰(就算一路上升,最後一個也是山峰),l = mid + 1。
  • 否則 mid 往右是下坡,mid 或它左邊一定有山峰,r = mid。

相鄰的值不相等,所以不會有平的地方。

我的嘗試
#

前幾版同時比較 mid - 1 和 mid + 1,邊界一直超出範圍(IndexError);一版把 nums 打成 num;最後一版 WA 回傳的位置不是山峰,例如 [0, 2, 4] 沒有回傳 2。

正確解法
#

class Solution:
    def findPeakElement(self, nums: List[int]) -> int:
        l, r = 0, len(nums) - 1
        while l < r:
            mid = (l + r) // 2
            if nums[mid] < nums[mid + 1]:
                l = mid + 1
            else:
                r = mid
        return l

複雜度
#

時間 O(log n),空間 O(1)。

要特別避免的錯誤
#

  • 用 while l < r,mid + 1 一定在範圍內。

面試口說整理
#

我比較中間和它右邊那個:往右是上坡就代表右邊一定有山峰,否則中間或左邊一定有。區間縮到一個位置就是山峰。時間 O(log n)。

相關文章

LeetCode 287: Find the Duplicate Number
·1 分鐘
LeetCode Medium Array Two-Pointers Binary-Search Bit-Manipulation
LeetCode 287 解題筆記:把 i -> nums[i] 看成鏈結串列,重複的值就是環的入口,用 Floyd 判圈;O(1) 空間、不改陣列
LeetCode 153: Find Minimum in Rotated Sorted Array
·1 分鐘
LeetCode Medium Array Binary-Search
LeetCode 153 解題筆記:拿 mid 跟右端比:nums[mid] > nums[r] 代表最小值在右邊,否則 mid 可能就是最小值,r = mid
LeetCode 875: Koko Eating Bananas
·1 分鐘
LeetCode Medium Array Binary-Search
LeetCode 875 解題筆記:對速度二分,找最小的 k 讓總時數 <= h;時數剛好等於 h 時還要繼續往左找
LeetCode 167: Two Sum II - Input Array Is Sorted
·1 分鐘
LeetCode Medium Array Two-Pointers Binary-Search
LeetCode 167 解題筆記:已排序,左右指針往中間走:和太大右指針左移,太小左指針右移;回傳的 index 從 1 開始
LeetCode 81: Search in Rotated Sorted Array II
·1 分鐘
LeetCode Medium Array Binary-Search
LeetCode 81 解題筆記:有重複值時 nums[l] == nums[mid] 會分不出哪一半有序,這時只能把 l 往右移一格;最壞 O(n)
LeetCode 74: Search a 2D Matrix
·1 分鐘
LeetCode Medium Array Binary-Search Matrix
LeetCode 74 解題筆記:每列接上一列是完整排序的,把矩陣當成長度 m × n 的一維陣列二分,mid 換成 (mid // n, mid % n)