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

LeetCode 154: Find Minimum in Rotated Sorted Array II

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

基本資料
#

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

  • 提交紀錄:Accepted(一次通過)

解題思路
#

在 LC 153 的基礎上多了重複值(Binary Search)。nums[mid] == nums[r] 時,例如 [3, 3, 1, 3] 和 [3, 1, 3, 3],斷點可能在任一邊,但可以確定拿掉 nums[r] 不會丟掉最小值(nums[mid] 跟它一樣),所以 r -= 1。

我的解法
#

class Solution:
    def findMin(self, nums: List[int]) -> int:
        l, r = 0, len(nums) - 1
        while l < r:
            mid = (l + r) // 2
            if nums[mid] > nums[r]:
                l = mid + 1
            elif nums[mid] < nums[r]:
                r = mid
            else:
                r -= 1                               # 相等時只能縮一格
        return nums[l]

複雜度
#

平均 O(log n),最壞 O(n),空間 O(1)。

要特別避免的錯誤
#

  • 相等時不能用 r = mid,最小值可能在 mid 和 r 之間。

面試口說整理
#

跟沒有重複時一樣拿中間跟右端比,但相等時分不出斷點在哪一邊;因為右端跟中間一樣,拿掉它不會丟掉最小值,所以右界減一。最壞 O(n)。

相關文章

LeetCode 1337: The K Weakest Rows in a Matrix
·1 分鐘
LeetCode Easy Array Binary-Search Sorting Heap-Priority-Queue
LeetCode 1337 解題筆記:每列的士兵都在前面,用二分找第一個 0 就是士兵數;照(士兵數, 列號)排序取前 k 個
LeetCode 349: Intersection of Two Arrays
·1 分鐘
LeetCode Easy Array Hash-Table Two-Pointers Binary-Search
LeetCode 349 解題筆記:兩個陣列各轉成集合取交集
LeetCode 350: Intersection of Two Arrays II
·1 分鐘
LeetCode Easy Array Hash-Table Two-Pointers Binary-Search
LeetCode 350 解題筆記:保留重複次數的交集,Counter 相交(&)取兩邊次數的較小值
LeetCode 275: H-Index II
·1 分鐘
LeetCode Medium Array Binary-Search
LeetCode 275 解題筆記:引用數已排序,找第一個 citations[i] >= n - i 的位置,答案是 n - i;用二分做到 O(log n)
LeetCode 540: Single Element in a Sorted Array
·1 分鐘
LeetCode Medium Array Binary-Search
LeetCode 540 解題筆記:單獨的那個出現之前,每一對都從偶數 index 開始;二分看偶數位置 mid 和 mid + 1 是否相同
LeetCode 611: Valid Triangle Number
·1 分鐘
LeetCode Medium Array Two-Pointers Binary-Search Greedy
LeetCode 611 解題筆記:排序後固定最長邊 k,左右指針找兩短邊:和夠大時中間的都可以,一次加 j - i 個