leetcode LCP.07 传递信息
Posted 短腿Cat
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode LCP.07 传递信息相关的知识,希望对你有一定的参考价值。
题目
链接:LCP.07 传递信息
题解
我使用的是深度遍历(dfs)
其解法用到了图论中的邻接矩阵,拿官方例子举例:n = 5, relation = [[0,2],[2,1],[3,4],[2,3],[1,4],[2,0],[0,4]], k = 3 这样一个参数,画出来的表长什么样呢?
其中纵列代表出的节点,行代表要入的节点,
- 有1代表由纵列节点到横行节点有单向边,如reuslt[0, 2] = 1,则代表如下:
- 为0则代表无边。
思路
-
对一个节点,遍历其所有的能出的节点,比如节点0,能到达2,4节点
-
再将其到达的2,4作为出的节点,同时步数+1,重复上述步骤(比如到达了2,就从纵列为2的节点再次遍历,有1就跳转过去,同时step+1)
-
最终如果步数step等于题目要求的3,同时停在了纵节点为(n - 1)的节点时,count加1。
-
所有遍历完之后,就完成了计数。
代码如下:
class Solution
static int count;
public int numWays(int n, int[][] relation, int k)
int[][] map = new int[n][n];
//初始化图
for (int i = 0; i < relation.length; i++)
map[relation[i][0]][relation[i][1]] = 1;
//开始dfs,从0,0开始,step初始化为0
dfs(0, 0, n, map, 0, k);
力扣测试用例好像就是创建一个对象反复用,所以如果不重置count的值的话,count会影响下一次测试用例的结果。
int result = count;
count = 0;
return result;
public void dfs(int i, int j, int n, int[][] map, int step, int k)
//做一做边界判断
if (i >= n || j >= n)
return;
//达到要求返回
if (step == k && i == n - 1)
count++;
return;
else if (step >= k)
return;
for (int x = j; x < n; x++)
if (map[i][x] == 1)
//将x作为下一步的i值,下一步j为0,遍历节点为i的所有可出节点,step+1
dfs(x, 0, n, map, step + 1, k);
return;
以上是关于leetcode LCP.07 传递信息的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode LCP 07. 传递信息 / NC111 最大数 / NC16 判断二叉树是否对称 / NC13 二叉树的最大深度