传递信息
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 22 ms, 内存: 16.0 MB
/*
* 思路:
* 1. 使用广度优先搜索 (BFS) 来找到所有从编号 0 到编号 n-1 的路径。
* 2. 需要传递 k 轮,因此我们在每次遍历时减少 k 的值。
* 3. 当 k 减少到 0 时,检查当前是否在编号 n-1 处,如果是则计数加一。
* 4. 使用 Java Stream 来处理路径的生成和过滤。
*/
import java.util.*;
import java.util.stream.*;
public class Solution {
public int numWays(int n, int[][] relation, int k) {
Map<Integer, List<Integer>> map = new HashMap<>();
for (int[] rel : relation) {
map.putIfAbsent(rel[0], new ArrayList<>());
map.get(rel[0]).add(rel[1]);
}
Queue<Integer> queue = new LinkedList<>();
queue.add(0);
int rounds = 0;
while (!queue.isEmpty() && rounds < k) {
int size = queue.size();
for (int i = 0; i < size; i++) {
int current = queue.poll();
List<Integer> nexts = map.getOrDefault(current, Collections.emptyList());
queue.addAll(nexts);
}
rounds++;
}
return (int) queue.stream().filter(player -> player == n - 1).count();
}
}
解释
方法:
该题解采用动态规划的方式来解决传递信息的问题。动态规划数组 dp[i][j] 代表经过 i 轮传递到编号 j 的玩家的方案数。首先初始化 dp[0][0] = 1,表示从玩家 0 开始传递信息。然后对每一轮传递 i 从 0 到 k-1 进行遍历,更新 dp[i+1][j] 的值,即在第 i+1 轮传递到编号 j 的方案数,根据关系数组 relation 更新。relation 中的每一对 [src, dst] 表示信息可以从 src 传递到 dst。对于每一对 [src, dst],当前轮 i 的 dp[i][src] 的值会加到下一轮 dp[i+1][dst] 上,表示经过 src 到达 dst 的所有可能的方案数。最终,dp[k][n-1] 就是问题的答案,即在第 k 轮传递到编号 n-1 的方案数。
时间复杂度:
O(k * relation.length)
空间复杂度:
O(k * n)
代码细节讲解
🦆
为什么在动态规划数组 dp 中使用 dp[i+1][edge[1]] += dp[i][edge[0]] 这种更新方式?这是基于什么原理?
▷🦆
在初始化 dp 数组时,为什么只将 dp[0][0] 设为 1,而其他 dp[0][j] (j != 0) 的值为 0?
▷🦆
如果 relation 数组为空,或者没有任何一条可以直接或间接从 0 到 n-1 的路径,这种情况下算法会如何处理?
▷