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则代表无边。

思路

  1. 对一个节点,遍历其所有的能出的节点,比如节点0,能到达2,4节点
    在这里插入图片描述

  2. 再将其到达的2,4作为出的节点,同时步数+1,重复上述步骤(比如到达了2,就从纵列为2的节点再次遍历,有1就跳转过去,同时step+1)
    在这里插入图片描述

  3. 最终如果步数step等于题目要求的3,同时停在了纵节点为(n - 1)的节点时,count加1。

  4. 所有遍历完之后,就完成了计数。

代码如下:

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. 传递信息

leetcode LCP.07 传递信息

leetcode LCP.07 传递信息

leetcode LCP 07. 传递信息

LeetCode LCP 07. 传递信息 / NC111 最大数 / NC16 判断二叉树是否对称 / NC13 二叉树的最大深度

文巾解题 LCP 07. 传递信息