Leetcode-LCP007-传递信息

Leetcode-LCP007-传递信息

题目描述

  • 小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下:
  • 有 n 名玩家,所有玩家编号分别为 0 ~ n-1,其中小朋友 A 的编号为 0
    每个玩家都有固定的若干个可传信息的其他玩家(也可能没有)。
  • 传信息的关系是单向的(比如 A 可以向 B 传信息,但 B 不能向 A 传信息)。
  • 每轮信息必须需要传递给另一个人,且信息可重复经过同一个人
1
2
3
4
5
6
7
8
9
10
11
12
给定总玩家数 n,以及按 [玩家编号,对应可传递玩家编号] 关系组成的二维数组 relation。返回信息从小 A (编号 0 ) 经过 k 轮传递到编号为 n-1 的小伙伴处的方案数;若不能到达,返回 0。


示例 1:
输入:n = 5, relation = [[0,2],[2,1],[3,4],[2,3],[1,4],[2,0],[0,4]], k = 3
输出:3
解释:信息从小 A 编号 0 处开始,经 3 轮传递,到达编号 4。共有 3 种方案,分别是 0->2->0->4, 0->2->1->4, 0->2->3->4。

示例 2:
输入:n = 3, relation = [[0,2],[2,1]], k = 2
输出:0
解释:信息不能从小 A 处经过 2 轮传递到编号 2

方法一 : DFS

  • 可以把传信息的关系看成有向图,每个玩家对应一个节点,每个传信息的关系对应一条有向边。

    • 如果 x 可以向 y 传信息,则对应从节点 x到节点 y 的一条有向边。
    • 寻找从编号 0 的玩家经过 k 轮传递到编号 n−1 的玩家处的方案数,等价于在有向图中寻找从节点 0 到节点 n-1 的长度为 k 的路径数,同一条路径可以重复经过同一个节点。
  • 可以使用深度优先搜索计算方案数

    • 从节点0出发做深度优先搜索,每一步记录当前所在的节点以及经过的轮数,当经过 k 轮时,如果位于节点 n-1,则将方案数加 1。
    • 搜索结束就是总的方案数量。
  • 具体实现方面,可以对传信息的关系进行预处理,使用列表存储有向边的关系,即可在O(1)的时间内得到特定节点的相邻节点(即可以沿着有向边一步到达的节点)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class Solution {
// 1. 节点变量和存放变量的列表
int n,k,ways;
List<List<Integer>> edges;

// 2. 主逻辑
public int numWays(int n, int[][] relation, int k) {
this.k = k;
this.n = n;
ways = 0;
edges = new ArrayList<List<Integer>>();

// 2.1 将边的关系存入列表
for(int i = 0;i < n;i++){
edges.add(new ArrayList<Integer>());
}
for(int[] edge:relation){
int src = edge[0];
int dst = edge[1];
edges.get(src).add(dst); // 建立边之间的关系
}
// 2.2 dfs
dfs(0,0);
return ways; // index0: 起点 index1:轮数
}

// 3. dfs逻辑
public void dfs(int index,int step){
// 3.1 dfs终止的条件
if(step == k){
if(index == n - 1){
ways++;
}
return;
}
// 3.2 搜索逻辑
List<Integer> list = edges.get(index);
for(int nextIndex : list){
dfs(nextIndex,step + 1);
}
}
}

复杂度分析

  • 时间复杂度:O(n ^ k)。 最多需要遍历 k 层,每层遍历最多有 O(n) 个分支。
  • 空间复杂度:O(n+m+k)。其中 m 为 relation 数组的长度。空间复杂度主要取决于图的大小和递归调用栈的深度,保存有向图信息所需空间为 O(n+m),递归调用栈的深度不会超过k

方法二:BFS

  • 后续待补充
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信