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

LeetCode 435: Non-overlapping Intervals

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

基本資料
#

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

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

解題思路
#

要刪最少,就是保留最多互不重疊的區間(Greedy 模板二)。按右端點排序,從左到右,左端點 >= 上一個保留的右端點就保留,否則刪掉。保留結束最早的,給後面留最多空間。

按左端點排序也可以:遇到重疊時刪掉其中一個,保留右端點比較小的(end = min(end, b))。

我的嘗試
#

這題用「按左端點排序」寫:

  • 2022-11-16 第一版遇到重疊時保留了右端點比較大的(max),應該留比較小的,才能讓後面的區間少撞到。改成 min 就 AC 了。
  • 2022-11-27 重寫時,重疊後沒有更新右端點,而且初始值設成 [0, 0],左端點是負數時會出錯;錯了四次才改回正確的寫法。

正確解法
#

class Solution:
    def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
        intervals.sort(key=lambda x: x[1])
        end, kept = float("-inf"), 0
        for a, b in intervals:
            if a >= end:
                kept += 1
                end = b
        return len(intervals) - kept

複雜度
#

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

要特別避免的錯誤
#

  • 只碰到端點不算重疊,用 >=。
  • 按左端點排序時,重疊後要保留比較短的那個(右端點取 min),不是 max。

面試口說整理
#

刪最少等於保留最多不重疊的區間,我按右端點排序,左端點不小於上一個保留的右端點就保留,最後用總數減掉保留數。保留結束最早的,給後面最多空間。時間 O(n log n)。

相關文章

LeetCode 313: Super Ugly Number
·1 分鐘
LeetCode Medium Array Math Dynamic-Programming
LeetCode 313 解題筆記:LC 264 的推廣,每個質數一個指針;用 heap 的話要避免同一個數被推進去很多次
LeetCode 396: Rotate Function
·1 分鐘
LeetCode Medium Array Math Dynamic-Programming
LeetCode 396 解題筆記:F(k) 和 F(k - 1) 只差一個公式:F(k) = F(k - 1) + sum - n × 被移到最前面的那個數
LeetCode 397: Integer Replacement
·1 分鐘
LeetCode Medium Dynamic-Programming Greedy Bit-Manipulation Memoization
LeetCode 397 解題筆記:偶數一定除以 2;奇數選 +1 或 -1,用記憶化遞迴;n 很大不能開 n 大小的陣列
LeetCode 473: Matchsticks to Square
·1 分鐘
LeetCode Medium Array Dynamic-Programming Backtracking Bit-Manipulation
LeetCode 473 解題筆記:總和要能被 4 整除;由大到小把每根火柴放進四個邊之一,超過邊長或跟前一個邊長度相同就跳過
LeetCode 229: Majority Element II
·1 分鐘
LeetCode Medium Array Hash-Table Sorting Counting
LeetCode 229 解題筆記:超過 n / 3 的數最多兩個;Boyer-Moore 維護兩個候選人,最後再掃一次確認次數
LeetCode 134: Gas Station
·1 分鐘
LeetCode Medium Array Greedy
LeetCode 134 解題筆記:總油量不夠就不可能;否則從左掃,油箱變負就把起點移到下一站