计算分配糖果的不同方式
难度:
标签:
题目描述
代码结果
运行时间: 286 ms, 内存: 86.2 MB
/*
* LeetCode 1692: Ways to Distribute Candies
* Using Java Streams for a concise approach.
* The approach will be similar to the DP solution but in a more functional style.
*/
import java.util.stream.IntStream;
public class SolutionStream {
private static final int MOD = 1000000007;
public int waysToDistributeCandies(int n, int k) {
if (k > n) return 0;
long[][] dp = new long[k + 1][n + 1];
dp[0][0] = 1;
IntStream.rangeClosed(1, k).forEach(i -> {
IntStream.rangeClosed(i, n).forEach(j -> {
dp[i][j] = (dp[i - 1][j - 1] + dp[i][j - i]) % MOD;
});
});
return (int) dp[k][n];
}
public static void main(String[] args) {
SolutionStream solution = new SolutionStream();
System.out.println(solution.waysToDistributeCandies(5, 3)); // Output example
}
}
解释
方法:
该题解使用了动态规划的方法,通过递归函数 `dfs` 来计算将 `n` 个糖果分配到 `k` 个盒子中的不同方式。如果 `k` 为1,或者 `n` 等于 `k`(即每个盒子只能放一个糖果),那么只有一种分配方式。递归关系为:`dfs(n, k) = (dfs(n - 1, k - 1) + dfs(n - 1, k) * k) % MOD`,这里 `dfs(n - 1, k - 1)` 表示新加入一个盒子放一个糖果的情况,而 `dfs(n - 1, k) * k` 表示在已有的 `k` 个盒子中任选一个放入新糖果的情况。结果通过模 `10^9 + 7` 确保不超出整数范围。
时间复杂度:
O(n * k)
空间复杂度:
O(n * k)
代码细节讲解
🦆
递归函数 `dfs(n, k)` 中,`MOD = 10**9 + 7` 的取值有什么特殊的意义或重要性?
▷🦆
在递归关系 `dfs(n, k) = (dfs(n - 1, k - 1) + dfs(n - 1, k) * k) % MOD` 中,为什么要将结果模 `MOD`?
▷🦆
如何确保递归过程中不会因为栈溢出而导致程序崩溃?
▷