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

LeetCode 2963: Count the Number of Good Partitions

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

基本資料
#

難易度: hard 第一次嘗試:2026-09-05

  • 提交紀錄:Accepted ×2

解題思路
#

「沒有兩段包含同一個數」⇔ 每個數的所有出現位置都在同一段。

  1. 記下每個數最後出現的位置 last[x]。
  2. 從左往右掃,維護目前這個區塊至少要延伸到 reach = max(last[x])。走到 i == reach 時,這個區塊結束,它不能再被切開。
  3. 得到 b 個不可再分的區塊。相鄰兩個區塊之間有 b - 1 個位置,每個位置可切可不切,答案是 2^(b - 1),取模。

這跟 LeetCode 2584 和「劃分字母區間」是同一個想法。

我的解法
#

class Solution:
    def numberOfGoodPartitions(self, nums: List[int]) -> int:
        last = {x: i for i, x in enumerate(nums)}  # 每個數最後出現的位置
        blocks = 0
        reach = 0
        for i, x in enumerate(nums):
            reach = max(reach, last[x])
            if i == reach:
                blocks += 1                        # 一個不可再分的區塊結束
        return pow(2, blocks - 1, 10 ** 9 + 7)

我原本的寫法是用 while 一次跳過整個區塊,意思一樣;用一個 for 迴圈維護 reach 比較簡潔。

複雜度
#

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

要特別避免的錯誤
#

  • 切點數是 b - 1,不是 b。
  • 2 的次方要取模。

面試口說整理
#

同一個數的所有出現位置必須在同一段,所以我先記下每個數最後出現的位置,從左往右掃,目前區塊至少要延伸到看過的數的最後位置,走到那裡就是一個不可再分的區塊。b 個區塊之間的 b - 1 個位置可切可不切,答案是 2^(b-1)。時間 O(n)。

相關文章

LeetCode 952: Largest Component Size by Common Factor
·2 分鐘
LeetCode Hard Math Number-Theory Union-Find Hash-Table Array
LeetCode 952 解題筆記:有共同因數 ⇔ 有共同的質因數;把每個數分解質因數,同一個質因數的 index 用 Union-Find 合併,不用兩兩算 GCD
LeetCode 3518: Smallest Palindromic Rearrangement II
·2 分鐘
LeetCode Hard Math Combinatorics Counting Hash-Table String
LeetCode 3518 解題筆記:回文由左半邊決定,變成「多重集合的第 k 個排列」;逐位試每個字元,用排列數判斷第 k 個落在哪個分支,排列數可以 O(1) 更新
LeetCode 992: Subarrays with K Different Integers
·1 分鐘
LeetCode Hard Sliding-Window Hash-Table Counting Array
LeetCode 992 解題筆記:「剛好 k 種」=「最多 k 種」−「最多 k - 1 種」,「最多」型的計數視窗每個右端加 right - left + 1
LeetCode 1627: Graph Connectivity With Threshold
·1 分鐘
LeetCode Hard Math Number-Theory Union-Find Array
LeetCode 1627 解題筆記:不用兩兩算 GCD;對每個 z > threshold,把 z 的所有倍數連起來,總共 O(n log n) 次合併
LeetCode 2912: Number of Ways to Reach Destination in the Grid
·2 分鐘
LeetCode Hard Dynamic-Programming State-Machine Math Combinatorics
LeetCode 2912 解題筆記:格子太多,但相對終點只分四類:終點、同一列、同一行、都不同;每一類的總方法數一起轉移,O(k)
LeetCode 3873: Maximum Points Activated with One Addition
·1 分鐘
LeetCode Hard Union-Find Hash-Table Array
LeetCode 3873 解題筆記:同 x 或同 y 的點用 Union-Find 合併成塊;新加的點最多接上兩塊,答案是最大的兩塊加 1