leetcode
leetcode 2851 ~ 2900
传递信息

传递信息

难度:

标签:

题目描述

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[i][src] 表示第 i 轮结束时,消息传递到玩家 src 的方案总数。当存在一条从 src 到 dst 的传递关系时,意味着在第 i+1 轮,玩家 src 可以将消息传递给玩家 dst。因此,我们将从 src 到 dst 的所有可能方案(即 dp[i][src])累加到 dp[i+1][dst] 上,从而更新第 i+1 轮传递到 dst 的方案数。这种方法确保了所有通过不同路径到达 dst 的方案都被计算在内。
🦆
在初始化 dp 数组时,为什么只将 dp[0][0] 设为 1,而其他 dp[0][j] (j != 0) 的值为 0?
初始化 dp[0][0] 为 1 是因为传递信息的游戏从玩家 0 开始,所以在游戏开始时只有玩家 0 有消息。此时,消息尚未传递给其他玩家,因此,对于所有 j != 0,dp[0][j] 的值为 0,表示在游戏开始时,除了玩家 0 外,没有其他玩家接收到消息。这种初始化设置反映了问题的初始条件和约束。
🦆
如果 relation 数组为空,或者没有任何一条可以直接或间接从 0 到 n-1 的路径,这种情况下算法会如何处理?
如果 relation 数组为空,或者不存在从玩家 0 到玩家 n-1 的路径,这意味着在 dp 数组的更新过程中,从 dp[0][0] 开始的值无法被传递到任何其他玩家,特别是最终的目标玩家 n-1。无论进行多少轮传递(即 k 轮),dp[k][n-1] 的值将保持为 0,因为没有任何有效的传递路径可以使消息到达玩家 n-1。这反映了算法在处理无法完成任务的情况时的行为:输出将为 0,表示没有可行的方案数。

相关问题