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

LeetCode 452: Minimum Number of Arrows to Burst Balloons

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

基本資料
#

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

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

解題思路
#

按右端點排序(Greedy 模板二)。第一支箭射在第一個氣球的右端點:越往右射,越有機會同時射到後面的氣球,但不能超過這個氣球的右端點。

接著往後看,氣球的左端點 <= 箭的位置就會被這支箭射到;左端點 > 箭的位置,就需要新的一支箭,射在這個氣球的右端點。

跟 LC 435 幾乎一樣,差別只在邊界:氣球是閉區間,[1,2] 和 [2,3] 一支箭射在 2 就能同時射破,所以端點相接算重疊,條件是 >;LC 435 的端點相接不算重疊,條件是 >=。

我的嘗試
#

一次通過。前一題剛寫完 LC 435,把條件從 >= 改成 > 就好。

正確解法
#

class Solution:
    def findMinArrowShots(self, points: List[List[int]]) -> int:
        points.sort(key=lambda x: x[1])
        arrows, pos = 0, float("-inf")
        for start, end in points:
            if start > pos:           # 目前的箭射不到,射一支新的在右端點
                arrows += 1
                pos = end
        return arrows

複雜度
#

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

要特別避免的錯誤
#

  • 照抄 LC 435 的 >=:[[1,2],[2,3]] 會回傳 2,答案是 1。
  • 按左端點排序時,遇到重疊要把箭的位置縮成 min(pos, end),否則會射不到右端點比較小的氣球。按右端點排序就不用處理這件事。

面試口說整理
#

我按右端點排序,每支箭都射在目前氣球的右端點,這樣能射到最多後面的氣球。往後掃,左端點不超過箭的位置就會被射到;超過的話就再射一支,射在那個氣球的右端點。端點相接算重疊,所以條件用大於,不是大於等於。時間 O(n log n)。

相關文章

LeetCode 948: Bag of Tokens
·1 分鐘
LeetCode Medium Two-Pointers Greedy Sorting Array
LeetCode 948 解題筆記:排序後,用最小的 token 換分數、用最大的 token 換能量;只有分數 > 0 才能換能量,換不了就停
LeetCode 3413: Maximum Coins From K Consecutive Bags
·2 分鐘
LeetCode Medium Sliding-Window Greedy Sorting Prefix-Sum Binary-Search Array
LeetCode 3413 解題筆記:最佳的 k 個袋子,一定有一端對齊某段的端點;分別算「左端對齊段的起點」和「右端對齊段的終點」(鏡像後重用同一個函式)
LeetCode 3627: Maximum Median Sum of Subsequences of Size 3
·1 分鐘
LeetCode Medium Math Greedy Sorting Game-Theory Array
LeetCode 3627 解題筆記:排序後每次拿最大的兩個和最小的一個,中位數是第二大的;答案是從尾端往前每隔一個取,共 n / 3 個
LeetCode 3075: Maximize Happiness of Selected Children
·1 分鐘
LeetCode Medium Array Greedy Sorting
LeetCode 3075 解題筆記:由大到小選 k 個,第 i 個選的會被扣 i,扣到 0 為止
LeetCode 324: Wiggle Sort II
·1 分鐘
LeetCode Medium Array Divide-and-Conquer Greedy Sorting
LeetCode 324 解題筆記:排序後分成小的一半和大的一半,各自反轉後交錯放:小的放偶數位置、大的放奇數位置
LeetCode 435: Non-overlapping Intervals
·1 分鐘
LeetCode Medium Array Dynamic-Programming Greedy Sorting
LeetCode 435 解題筆記:最少刪幾個 = 總數減掉最多能保留幾個;按右端點排序,貪心保留結束最早的