Medium草稿★★★★★O(target * n) 時間 · O(target) 空間
Dynamic ProgrammingArray
Patterns📈 線性 DP・Kadane
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

377Combination Sum IV1-D DPMedium1-D DP

給定一個不重複的正整數陣列 nums 和一個目標值 target,求湊成 target 的排列數(不同順序算不同組合)。

Example:

Input: nums = [1,2,3], target = 4 Output: 7

Intuition

TIP

類似 Coin Change 但求排列數 — 外層迴圈遍歷目標值,內層遍歷 nums。

Approaches

1. Top-Down Memoization — O(target * n) / O(target)
  • Idea: 遞迴嘗試每個 num,記憶化子問題
  • Time: O(target * n)
  • Space: O(target)
class Solution {
    fun combinationSum4(nums: IntArray, target: Int): Int {
        val memo = IntArray(target + 1) { -1 }
        fun dp(rem: Int): Int {
            if (rem == 0) return 1
            if (rem < 0) return 0
            if (memo[rem] != -1) return memo[rem]
            var count = 0
            for (num in nums) {
                count += dp(rem - num)
            }
            memo[rem] = count
            return count
        }
        return dp(target)
    }
}
⭐ 2. Bottom-Up DP — O(target * n) / O(target)
  • Idea: 自底向上填表,外層遍歷目標值,內層遍歷所有可用數字
  • Time: O(target * n)
  • Space: O(target)
class Solution {
    fun combinationSum4(nums: IntArray, target: Int): Int {
        val dp = IntArray(target + 1)
        dp[0] = 1
        for (i in 1..target) {
            for (num in nums) {
                if (num <= i) {
                    dp[i] += dp[i - num]
                }
            }
        }
        return dp[target]
    }
}

🔑 Takeaways

Ladders 看全部 →

🪙

零錢 / 計數背包

同樣是無界背包,問法決定迴圈順序。

  1. 1#322Coin ChangeMedium湊出金額的最少硬幣數
  2. 2#518Coin Change IIMedium湊法總數(組合,硬幣外層)
  3. 3