当前位置: 首页 > news >正文

(nice!!!)(LeetCode 每日一题) 3372. 连接两棵树后最大目标节点数目 I (贪心+深度优先搜索dfs)

题目:3372. 连接两棵树后最大目标节点数目 I

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路:贪心+深度优先搜索dfs。时间复杂度0(n2+m2),细节看注释。

第二棵树 ,其实就是找出从某个点出发,k-1步能得到的最大目标节点个数mx。

C++版本:

class Solution {
public:// 构建邻接表void solve(vector<vector<int>>& edge,vector<vector<int>> &g){for(auto e:edge){int x=e[0],y=e[1];g[x].push_back(y);g[y].push_back(x);}}//参数:u表示当前结点、fa表示当前结点的父节点、d表示当前的距离//返回值:当前节点u还能抵达的目标子节点个数int dfs(int u,int fa,int d,vector<vector<int>> &g,int k){if(d>k) return 0;int ans=1;for(auto x:g[u]){if(x==fa) continue;ans+=dfs(x,u,d+1,g,k);}return ans;}vector<int> maxTargetNodes(vector<vector<int>>& edges1, vector<vector<int>>& edges2, int k) {//转成邻接表,便于后续dfs的遍历int n=edges1.size(),m=edges2.size();vector<vector<int>> g1(n+1),g2(m+1);solve(edges1,g1);solve(edges2,g2);//第二棵树 ,k-1步能得到的最大目标节点个数mx。int mx=0;for(int i=0;i<=m;i++){int t=dfs(i,-1,0,g2,k-1);mx=max(mx,t);}//答案vector<int> v;for(int i=0;i<=n;i++){int t=dfs(i,-1,0,g1,k);v.push_back(t+mx);//cout<<t<<"---"<<mx<<endl;}return v;}
};

JAVA版本:

class Solution {void solve(int[][] edge,List<List<Integer>> g){for(var e:edge){int x=e[0],y=e[1];g.get(x).add(y);g.get(y).add(x);}}int dfs(int u,int fa,int d,List<List<Integer>> g,int k){if(d>k) return 0;int ans=1;for(var x:g.get(u)){if(x==fa) continue;ans+=dfs(x,u,d+1,g,k);}return ans;}public int[] maxTargetNodes(int[][] edges1, int[][] edges2, int k) {int n=edges1.length,m=edges2.length;List<List<Integer>> g1=new ArrayList<>();List<List<Integer>> g2=new ArrayList<>();for(int i=0;i<=n;i++){g1.add(new ArrayList<Integer>());}for(int i=0;i<=m;i++){g2.add(new ArrayList<Integer>());}solve(edges1,g1);solve(edges2,g2);int mx=0;for(int i=0;i<=m;i++){int t=dfs(i,-1,0,g2,k-1);mx=Math.max(mx,t);}int[] v=new int[n+1];for(int i=0;i<=n;i++){int t=dfs(i,-1,0,g1,k);v[i]=t+mx;//cout<<t<<"---"<<mx<<endl;}return v;}
}

Go版本:

func maxTargetNodes(edges1 [][]int, edges2 [][]int, k int) []int {n:=len(edges1)m:=len(edges2)g1:=make([][]int,n+1)g2:=make([][]int,m+1)solve(g1,edges1)solve(g2,edges2)mx:=0for i:=0;i<=m;i++ {t:=dfs(i,-1,0,g2,k-1)mx=max(mx,t)}v:=make([]int,n+1)for i:=0;i<=n;i++ {t:=dfs(i,-1,0,g1,k)v[i]=t+mx}return v
}
func solve(g [][]int,edges [][]int) {for _,e := range edges {x,y:=e[0],e[1]g[x]=append(g[x],y)g[y]=append(g[y],x)}
}func dfs(u int,fa int,d int,g [][]int,k int) int{if d>k {return 0}ans:=1for _,x:=range g[u] {if x!=fa {ans+=dfs(x,u,d+1,g,k)} }return ans
}
http://www.xdnf.cn/news/701749.html

相关文章:

  • GPU时间与transformer架构计算量分析
  • qemu安装risc-V 64
  • springboot配置mybatis debug的sql日志输出
  • DelayQueue源码解析
  • 《活法》
  • Python实例题:Python实现FTP弱口令扫描器
  • 如何去除文章的AI痕迹2025新方法
  • DeepSeek 工作应用深度指南
  • 二叉树的锯齿形层序遍历——灵活跳跃的层次结构解析
  • 第十一节:第三部分:异常:异常的两种处理方式
  • 【Unity】自动生成围绕模型的路径点
  • 企业应如何构建用户画像系统
  • C语言Day9:C语言类型转换规则
  • Linux Crash工具全解:内核崩溃分析的一切
  • shell脚本总结11
  • 华为OD机试真题——矩形绘制(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现
  • 数据库表与实体类设计
  • 中望CAD与AutoCAD的SWOT对比分析(基于2025线上发布会观察与行业数据)
  • 阿里云云效对接SDK获取流水线制品
  • C++模板语法大全
  • Rust 的Hello World
  • 在qt中使用c++实现与Twincat3 PLC变量通信
  • 知行之桥如何将消息推送到钉钉群?
  • 前端面经 hook 获取dom元素
  • Cookie与Session简介-笔记
  • 代谢测定试剂盒_生化制剂_Sigma-Aldrich®实验室用品及生产材料
  • FastApi学习
  • AMBA-AHB的控制信号
  • jenkins部署slave动态节点
  • java 开发中 nps的内网穿透 再git 远程访问 以及第三放支付接口本地调试中的作用