祝我党百年华诞生日快乐

LCP 07. 传递信息

2021.7.1 每日一题

题目描述

小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下:有 n 名玩家,所有玩家编号分别为 0 ~ n-1,其中小朋友 A 的编号为 0
每个玩家都有固定的若干个可传信息的其他玩家(也可能没有)。传信息的关系是单向的(比如 A 可以向 B 传信息,但 B 不能向 A 传信息)。
每轮信息必须需要传递给另一个人,且信息可重复经过同一个人
给定总玩家数 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限制:2 <= n <= 10
1 <= k <= 5
1 <= relation.length <= 90, 且 relation[i].length == 2
0 <= relation[i][0],relation[i][1] < n 且 relation[i][0] != relation[i][1]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/chuan-di-xin-xi
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

深度优先搜索,或者广度优先搜索都可以
先将数组变成一个哈希表

class Solution {int res = 0;int n;public int numWays(int n, int[][] relation, int k) {//简单题,感觉写起来不简单啊//用一个<i ,list>存储this.n = n;int l = relation.length;Map<Integer, List<Integer>> map = new HashMap<>();for(int[] t : relation){List<Integer> list = map.getOrDefault(t[0], new ArrayList<>());list.add(t[1]);map.put(t[0], list); }dfs(map, 0, k);return res;}public void dfs(Map<Integer, List<Integer>> map, int person, int k){if(k == 0 && person == n - 1){res++;return;}if(k == 0)return;List<Integer> list = map.get(person);if(list == null)return;for(int p : list){dfs(map, p, k - 1);}}
}

动态规划,dp[i][j]定义为第 i 轮传递到第 j 个人的方案数

class Solution {public int numWays(int n, int[][] relation, int k) {//看下动规,就记录所有的情况,然后再转移//dp[i][j] 表示第k轮传递到 person的方案数int l = relation.length;int[][] dp = new int[k + 1][n];//初始化,刚开始在0号人dp[0][0] = 1;for(int i = 0; i < k; i++){for(int[] t : relation){//从t[0]传递到t[1]dp[i + 1][t[1]] += dp[i][t[0]];}}return dp[k][n - 1];}
}

还可以利用矩阵快速幂,正好就是求的路径数目
https://www.cnblogs.com/Equinox-Flower/p/11726324.html#_label0

NC111 最大数

题目描述

给定一个数组由一些非负整数组成,现需要将他们进行排列并拼接,使得最后的结果最大,返回值需要是string类型 否则可能会溢出示例1
输入:
[30,1]返回值:
"301"

思路

主要还是排序问题,用字符串排序,从大到小排序
排序规则就是两个字符串拼接拼接以后的大小

import java.util.*;public class Solution {/*** 最大数* @param nums int整型一维数组 * @return string字符串*/public String solve (int[] nums) {// write code here//是一个排序问题int l = nums.length;String[] ss = new String[l];for(int i = 0; i < l; i++){ss[i] = String.valueOf(nums[i]);}//从大到小Arrays.sort(ss, new Comparator<String>(){public int compare(String s1, String s2){return (s2 + s1).compareTo(s1 + s2);}});if(ss[0].equals("0"))return "0";StringBuffer sb = new StringBuffer();for(String s : ss){sb.append(s);}return sb.toString();}
}

NC16 判断二叉树是否对称

题目描述

给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)
例如:下面这棵二叉树是对称的
1
/  \
2    2
/ \    / \
3 4  4  3
下面这棵二叉树不对称。
1
/ \
2   2
\    \
3    3
备注:
希望你可以用递归和迭代两种方法解决这个问题
示例1
输入:
{1,2,2}
返回值:
true示例2
输入:
{1,2,3,3,#,2,#}
返回值:
false

思路

都是剑指Offer的题,相当于复习了
递归

import java.util.*;/** public class TreeNode {*   int val = 0;*   TreeNode left = null;*   TreeNode right = null;* }*/public class Solution {/*** * @param root TreeNode类 * @return bool布尔型*/public boolean isSymmetric (TreeNode root) {// write code hereif(root == null)return true;return same(root.left, root.right);}public boolean same(TreeNode left, TreeNode right){if(left == null && right == null)return true;if(left == null || right == null)return false;return left.val == right.val && same(left.left, right.right) && same(left.right, right.left);}
}

迭代

import java.util.*;/** public class TreeNode {*   int val = 0;*   TreeNode left = null;*   TreeNode right = null;* }*/public class Solution {/*** * @param root TreeNode类 * @return bool布尔型*/public boolean isSymmetric (TreeNode root) {// write code hereif(root == null)return true;Queue<TreeNode> queue = new LinkedList<>();queue.offer(root.left);queue.offer(root.right);while(!queue.isEmpty()){TreeNode n1 = queue.poll();TreeNode n2 = queue.poll();if(n1 == null && n2 == null)continue;if(n1 == null || n2 == null)return false;if(n1.val != n2.val)return false;queue.offer(n1.left);queue.offer(n2.right);queue.offer(n1.right);queue.offer(n2.left);}return true;}
}

NC13 二叉树的最大深度

题目描述

求给定二叉树的最大深度,
最大深度是指树的根结点到最远叶子结点的最长路径上结点的数量。示例1
输入:
{1,2}返回值:
2示例2
输入:
{1,2,3,4,#,#,5}返回值:
3

思路

广度优先搜索

import java.util.*;/** public class TreeNode {*   int val = 0;*   TreeNode left = null;*   TreeNode right = null;* }*/public class Solution {/*** * @param root TreeNode类 * @return int整型*/public int maxDepth (TreeNode root) {// write code hereif(root == null)return 0;int deep = 0;Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while(!queue.isEmpty()){deep++;int size = queue.size();while(size-- > 0){TreeNode node = queue.poll();if(node.left != null)queue.offer(node.left);if(node.right != null)queue.offer(node.right);}}return deep;}
}

深度

import java.util.*;/** public class TreeNode {*   int val = 0;*   TreeNode left = null;*   TreeNode right = null;* }*/public class Solution {/*** * @param root TreeNode类 * @return int整型*/int max = 0;public int maxDepth (TreeNode root) {// write code hereif(root == null)return 0;dfs(root, 0);return max;}public void dfs(TreeNode node, int deep){if(node == null){max = Math.max(max, deep);return;}dfs(node.left, deep + 1);dfs(node.right, deep + 1);}
}

或者

public class Solution {/**** @param root TreeNode类* @return int整型*/public int maxDepth (TreeNode root) {if(root == null) return 0; //节点为空返回0int lh = maxDepth(root.left); // 求出左子树的最大高度int rh = maxDepth(root.right); //求出右子树的最大高度return Math.max(lh,rh) + 1; //左右子树高度求一个最大然后+1}
}

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

  1. leetcode LCP 07.传递信息

    原题 LCP 07.传递信息 题解 方法一 动态规划 动态规划说明某一种状态一定与前一种或者前几种状态有关.我们不妨设立一个二维数组ans,其中ans[j][i]表示的是,从0开始,通过j+1步到达i ...

  2. leetcode LCP 07. 传递信息

    BFS&DFS&DP 题目描述 DFS BFS DP 题目描述 小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下: 1.有 n 名玩家,所有玩家编号分别为 0 - n-1, ...

  3. 【力扣-LeetCode】LCP 07. 传递信息 C++题解

    LCP 07. 传递信息 难度简单248收藏分享切换为英文接收动态反馈 小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下: 有 n 名玩家,所有玩家编号分别为 0 - n-1,其中小朋友 ...

  4. 文巾解题 LCP 07. 传递信息

    1 题目描述 2 解题思路 2.1 动态规划 定义动态规划的状态 dp[i][j] 为经过 i 轮传递到编号 j 的玩家的方案数,其中0≤i≤k,0≤j<n. 由于从编号 0 的玩家开始传递,当 ...

  5. LCP 07. 传递信息

    小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下: 有 n 名玩家,所有玩家编号分别为 0 - n-1,其中小朋友 A 的编号为 0 每个玩家都有固定的若干个可传信息的其他玩家(也可能没有 ...

  6. LCP 07. 传递信息 (Python 实现)

    题目: 小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下: 1.有 n 名玩家,所有玩家编号分别为 0 - n-1,其中小朋友 A 的编号为 0 2.每个玩家都有固定的若干个可传信息的其他 ...

  7. LeetCode——LCP 29. 乐团站位[简单]——分析及代码(Java)

    LeetCode--LCP 29. 乐团站位[简单]--分析及代码[Java] 一.题目 二.分析及代码 1. 直接计算 (1)思路 (2)代码 (3)结果 三.其他 一.题目 某乐团的演出场地可视作 ...

  8. LeetCode 98. Validate Binary Search Tree--C++解法--判断是否是BST--递归,迭代做法,中序遍历

    LeetCode 98. Validate Binary Search Tree–C++解法–判断是否是BST–递归,迭代做法,中序遍历 LeetCode题解专栏:LeetCode题解 LeetCod ...

  9. 1.9 编程基础之顺序查找 07 不与最大数相同的数字之和

    http://noi.openjudge.cn/ch0109/07/ /* 1.9 编程基础之顺序查找 07 不与最大数相同的数字之和 http://noi.openjudge.cn/ch0109/0 ...

最新文章

  1. Android应用程序键盘(Keyboard)消息处理机制分析(20)
  2. reactivecocoa button的几种点击方式
  3. led显示屏p10参数设置_LED显示屏全彩P10的详细参数及说明
  4. tomcat apache mysql_Android实现与Apache Tomcat服务器数据交互(MySql数据库)
  5. 没变强是因为你太舒服(图)
  6. 查看计算机上隐藏用户,隐藏或显示 InetOrgPerson 对象类 - Windows Server | Microsoft Docs...
  7. Spring Cloud中的@EnableDiscoveryClient注解和@EnableEurekaClient注解
  8. 苹果Mac侧边栏笔记工具:​​​​​​​​SideNotes
  9. 陕西大数据产业建设总投资达500亿元
  10. oracle 中 cursor 与refcursor及sys_refcursor的区别 (转载)
  11. Matlab【光学】波动光光学系统
  12. Win10怎么安装Apache服务
  13. java 佛祖保佑_佛祖保佑,永无bug
  14. 汽车销量查询小助手(小程序)开发心路历程
  15. Android权限 - AppOps介绍
  16. 笔记本计算机屏幕亮度暗,笔记本屏幕暗,详细教您怎么解决
  17. 万有引力太阳系行星轨迹模拟
  18. go文件上传断点续传功能
  19. 从业了八年程序员觉得已经是非常的枯燥了
  20. Lodop常用属性和方法字典(转)

热门文章

  1. Python进阶之正则表达式
  2. 一个资深程序员的忠告
  3. Bootstrap框架的了解和使用(一)
  4. Vulnhub DC-3
  5. rap技术原理_RAP如何自动在 方法上生成前端开发文档
  6. 基于jsp+mysql+Spring+mybatis的SpringBoot美容院预约管理系统
  7. 女友竟用TA集齐了雪橇三傻! Truffle这口狗粮干货值了…
  8. 计算机网络专业知识与技能大赛,浅谈职业技能大赛对于计算机网络技术专业教学改革的新思路...
  9. sum多个字段的值相加_求和不要说你只会SUM,Excel全部9种数据求和操作你应该要会...
  10. Macbook Pro M1芯片Python开发环境配置