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

LeetCode 3323: Minimize Connected Groups by Inserting Interval

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

基本資料
#

難易度: medium 第一次嘗試:2026-01-28

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

解題思路
#

  1. 先合併:排序後把重疊或相接的區間合併,得到 m 個互不相連的組。
  2. 新區間長度最多 k。要把第 l 組到第 r 組連成一組,新區間要從第 l 組的終點蓋到第 r 組的起點:merged[r].start - merged[l].end <= k。
  3. 用滑動視窗找一次能連起來最多幾組 cnt,答案是 m - (cnt - 1)。

r 往右時起點變大,能連到的 l 只會往右,條件單調。

我的解法
#

class Solution:
    def minConnectedGroups(self, intervals: List[List[int]], k: int) -> int:
        intervals.sort()
        merged = []
        for start, end in intervals:
            if merged and start <= merged[-1][1]:
                merged[-1][1] = max(merged[-1][1], end)
            else:
                merged.append([start, end])

        best = left = 0
        for right in range(len(merged)):
            while merged[right][0] - merged[left][1] > k:
                left += 1                          # 新區間蓋不到
            best = max(best, right - left + 1)
        return len(merged) - (best - 1)

right == left 時 merged[right][0] - merged[left][1] 是負的,所以 left 不會超過 right,best 至少是 1。

複雜度
#

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

要特別避免的錯誤
#

  • 沒先合併就在原區間上滑動:重疊的區間會被算成好幾組。
  • 連起 cnt 組,組數減少的是 cnt - 1,不是 cnt。

面試口說整理
#

我先把區間排序合併成互不相連的組。新區間長度最多 k,要把第 l 到第 r 組連起來,需要第 r 組的起點減第 l 組的終點不超過 k。這個條件隨 r 單調,用滑動視窗找一次最多能連幾組,組數就少掉那個數量減一。時間 O(n log n)。

相關文章

LeetCode 1838: Frequency of the Most Frequent Element
·1 分鐘
LeetCode Medium Sliding-Window Sorting Greedy Prefix-Sum Binary-Search Array
LeetCode 1838 解題筆記:排序後,把視窗裡的數都加到 nums[right] 的花費是 nums[right] × 長度 − 視窗總和;花費 > k 就縮左邊
LeetCode 2271: Maximum White Tiles Covered by a Carpet
·1 分鐘
LeetCode Medium Sliding-Window Greedy Sorting Prefix-Sum Binary-Search Array
LeetCode 2271 解題筆記:地毯的左端放在某段白磚的起點一定不會更差;排序後用雙指針,完整蓋住的段累加,最後一段只算部分
LeetCode 3634: Minimum Removals to Balance Array
·1 分鐘
LeetCode Medium Sliding-Window Sorting Binary-Search Array
LeetCode 3634 解題筆記:排序後留下來的一定是連續一段;對每個最小值 nums[left],用只往右走的指針找能留到哪裡,刪掉兩邊剩下的
LeetCode 3413: Maximum Coins From K Consecutive Bags
·2 分鐘
LeetCode Medium Sliding-Window Greedy Sorting Prefix-Sum Binary-Search Array
LeetCode 3413 解題筆記:最佳的 k 個袋子,一定有一端對齊某段的端點;分別算「左端對齊段的起點」和「右端對齊段的終點」(鏡像後重用同一個函式)
LeetCode 2779: Maximum Beauty of an Array After Applying Operation
·1 分鐘
LeetCode Medium Sliding-Window Sorting Binary-Search Array
LeetCode 2779 解題筆記:每個數可以變成 [x - k, x + k] 裡的任何值,一群數能變成同一個值 ⇔ 最大 - 最小 <= 2k;排序後找最長的這種視窗
LeetCode 1040: Moving Stones Until Consecutive II
·1 分鐘
LeetCode Medium Sliding-Window Math Sorting Array
LeetCode 1040 解題筆記:最多步數 = 總空位 − 第一步會浪費掉的那一邊空隙;最少步數用長度 n 的視窗找最多石頭,n - 1 顆已連續、剩一顆在遠處時要特判成 2