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

LeetCode 757: Set Intersection Size At Least Two

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

基本資料
#

難易度: hard 第一次嘗試:2026-07-08

  • 提交紀錄:Accepted ×2

解題思路
#

按右端點由小到大處理(Greedy 模板二)。要放點時,放在目前區間的最右邊:後面的區間右端點只會更大,放右邊最有機會被它們共用。

所以只要記住目前放的最右邊兩個點 p1 < p2:

  • s > p2:一個都沒蓋到,放 e - 1 和 e 兩個點。
  • p1 < s <= p2:只蓋到 p2,再放 e,新的兩點是 p2, e。
  • s <= p1:兩個都蓋到,不用放。

同一個右端點時,左端點大的(短的)先處理。不然「只蓋到一個」時補的 e 可能就是已經放的 p2,等於同一個點算了兩次。如果第二個 key 換成 x[0](長的先)就會錯,例如 [[0, 1], [1, 3], [2, 3], [3, 4]],答案是 5(例如 0, 1, 2, 3, 4)。長的先處理時,[1, 3] 補了 3,接著 [2, 3] 又「補」一次 3,兩個點都記成 3,[3, 4] 就以為已經蓋到兩個,結果回傳 4。

我的解法
#

class Solution:
    def intersectionSizeTwo(self, intervals: List[List[int]]) -> int:
        intervals.sort(key=lambda x: (x[1], -x[0]))
        p1 = p2 = -1                       # start >= 0,所以 -1 不會被蓋到
        res = 0
        for s, e in intervals:
            if s > p2:
                res += 2
                p1, p2 = e - 1, e
            elif s > p1:
                res += 1
                p1, p2 = p2, e
        return res

我當時用第一個區間初始化 p1, p2;用 -1 當初始值可以讓第一個區間也走同一個分支。

複雜度
#

時間 O(n log n),空間 O(1)(不算排序)。

要特別避免的錯誤
#

  • 點要放在右端,不是左端。
  • 排序要有第二個 key:同右端點時左端點大的先。

面試口說整理
#

我按右端點排序,只記住最右邊的兩個點。新區間一個都沒蓋到就放它最右邊的兩個點,只蓋到一個就補它的右端點。點放越右邊,後面右端點更大的區間越可能共用。同右端點時短的先處理,避免要補的點跟已經放的重複。時間 O(n log n)。

相關文章

LeetCode 1402: Reducing Dishes
·1 分鐘
LeetCode Hard Dynamic-Programming Greedy Sorting Array
LeetCode 1402 解題筆記:排序後從滿意度大的開始選;每多選一道放在最前面,前面選的都往後一格,總和增加「目前選的滿意度總和」,總和是正的就繼續選
LeetCode 1526: Minimum Number of Increments on Subarrays to Form a Target Array
·1 分鐘
LeetCode Hard Dynamic-Programming Greedy Monotonic-Stack Array
LeetCode 1526 解題筆記:從左往右看,每次比前一個高,多出來的高度都要新開那麼多次操作;變矮的部分可以沿用之前的操作
LeetCode 1147: Longest Chunked Palindrome Decomposition
·1 分鐘
LeetCode Hard Dynamic-Programming Greedy Two-Pointers Rolling-Hash String
LeetCode 1147 解題筆記:從兩端同時往內累積字串,左右一相等就切成一對;越早切越好,剩下的中間(如果有)算一塊
LeetCode 1727: Largest Submatrix With Rearrangements
·1 分鐘
LeetCode Medium Greedy Sorting Matrix
LeetCode 1727 解題筆記:每列算出往上連續 1 的高度,欄可以重排,所以把高度由大到小排序,第 j 高乘上 j + 1
LeetCode 1833: Maximum Ice Cream Bars
·1 分鐘
LeetCode Medium Greedy Sorting Counting-Sort
LeetCode 1833 解題筆記:從最便宜的開始買;題目要求計數排序,值域只有 10^5,每個價格一次買 min(數量, 錢 // 價格) 個
LeetCode 3555: Smallest Subarray to Sort in Every Sliding Window
·1 分鐘
LeetCode Medium Two-Pointers Greedy Sorting Array Monotonic-Stack
LeetCode 3555 解題筆記:每個長度 k 的視窗都是一次 LeetCode 581;n 只有 1000,對每個視窗跑 O(k) 的兩次掃描即可