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

article/2025/8/21 16:47:47

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路:贪心+深度优先搜索dfs,时间复杂度0(n+m)。

第二棵树:对每个节点进行分类,0或1,相邻的节点肯定不同啦,这样就可以统计出0和1 各自的节点个数。

对于第一颗树而言,也是一样处理的,细节看注释。

C++版本:

class Solution {
public:// 构建链接表void solve(vector<vector<int>> & g,vector<vector<int>>& edges){for(auto e:edges){int x=e[0],y=e[1];g[x].push_back(y);g[y].push_back(x);}}// dfs第二棵树,统计0、1节点的个数void dfs1(int u,int fa,int d,vector<vector<int>> & g,vector<int> &cnt1){cnt1[d]++;for(auto x:g[u]){if(x==fa) continue;dfs1(x,u,d^1,g,cnt1);}}// dfs第一颗树,统计0、1节点的个数,同时用数组ans记录每个节点u所在的节点状态d(0,1)void dfs2(int u,int fa,int d,vector<vector<int>> & g,vector<int> &cnt1,vector<int> &ans){cnt1[d]++;ans[u]=d;for(auto x:g[u]){if(x==fa) continue;dfs2(x,u,d^1,g,cnt1,ans);}}vector<int> maxTargetNodes(vector<vector<int>>& edges1, vector<vector<int>>& edges2) {// 构建链接表int n=edges1.size(),m=edges2.size();vector<vector<int>> g1(n+1),g2(m+1);solve(g1,edges1);solve(g2,edges2);// 统计0、1节点的个数vector<int> cnt1(2,0);// 先dfs第二棵树dfs1(0,-1,0,g2,cnt1);// 找出最大的类别用于和第一颗树的节点相连// 注意m是大于等于2的,所以一定会有一个类别最大。不存在m=1的情况,导致出问题int mx=max(cnt1[0],cnt1[1]);// 答案vector<int> ans(n+1,0);// 初始化,用于记录第一颗树的0、1节点的个数cnt1[0]=0,cnt1[1]=0;// dfs第二棵树dfs2(0,-1,0,g1,cnt1,ans);for(int i=0;i<=n;i++){ans[i]=cnt1[ans[i]]+mx;}return ans;}
};

JAVA版本:

class Solution {void solve(List<List<Integer>> g,int[][] edges){for(var e:edges){int x=e[0],y=e[1];g.get(x).add(y);g.get(y).add(x);}}void dfs1(int u,int fa,int d,List<List<Integer>> g,int[] cnt1){cnt1[d]++;for(var x:g.get(u)){if(x==fa) continue;dfs1(x,u,d^1,g,cnt1);}}void dfs2(int u,int fa,int d,List<List<Integer>> g,int[] cnt1,int[] ans){cnt1[d]++;ans[u]=d;for(var x:g.get(u)){if(x==fa) continue;dfs2(x,u,d^1,g,cnt1,ans);}}public int[] maxTargetNodes(int[][] edges1, int[][] edges2) {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<>());}for(int i=0;i<=m;i++){g2.add(new ArrayList<>());}solve(g1,edges1);solve(g2,edges2);int[] cnt1=new int[2];dfs1(0,-1,0,g2,cnt1);int mx=Math.max(cnt1[0],cnt1[1]);int[] ans=new int[n+1];cnt1[0]=0;cnt1[1]=0;dfs2(0,-1,0,g1,cnt1,ans);for(int i=0;i<=n;i++){ans[i]=cnt1[ans[i]]+mx;}return ans;}
}

Go版本:

func maxTargetNodes(edges1 [][]int, edges2 [][]int) []int {n:=len(edges1)m:=len(edges2)g1:=make([][]int,n+1)g2:=make([][]int,m+1)solve(edges1,g1)solve(edges2,g2)cnt:=make([]int,2)dfs1(0,-1,0,g2,cnt)mx:=max(cnt[0],cnt[1])cnt[0],cnt[1]=0,0ans:=make([]int,n+1)dfs2(0,-1,0,g1,cnt,ans)for i:=0;i<=n;i++ {ans[i]=cnt[ans[i]]+mx}return ans
}func solve(edges [][]int,g [][]int) {for _,e:= range edges {x,y:=e[0],e[1]g[x]=append(g[x],y)g[y]=append(g[y],x)}
}func dfs1(u int,fa int,d int,g [][]int,cnt []int){cnt[d]++for _,x:=range g[u] {if x!=fa {dfs1(x,u,d^1,g,cnt)}}
}
func dfs2(u int,fa int,d int,g [][]int,cnt []int,ans []int){ans[u]=dcnt[d]++for _,x:=range g[u] {if x!=fa {dfs2(x,u,d^1,g,cnt,ans)}}
}

http://www.hkcw.cn/article/OBAEcmkfIE.shtml

相关文章

开疆智能Profinet转Profibus网关连接EC-CM-P1 PROFIBUS DP从站通讯模块配置案例

本案例是通过开疆智能Profibus转Profinet网关将正弦研发的Profibus从站模块连接的EM600变频器接入到西门子1200PLC的配置案例。 配置过程 1. 打开网关配置软件“”新建项目并添加模块PN2DPM并设置参数 2. 设置网关的Profibus参数。如站地址&#xff0c;波特率等。&#xff08;…

【计算机常识】--环境变量

在 Linux/Unix 系统中&#xff0c;​​环境变量&#xff08;Environment Variables&#xff09;​​是操作系统或用户设置的全局参数&#xff0c;用于存储系统或程序的配置信息。其中&#xff0c;​​PATH​​ 是最重要的环境变量之一&#xff0c;它决定了系统在哪些目录中查找…

孙颖莎含泪感谢邱贻可 坚定追求大满贯梦想

孙颖莎含泪感谢邱贻可 坚定追求大满贯梦想!5月29日,在多哈世乒赛上,孙颖莎实现了混双三连冠并卫冕女单冠军。她坦言为自己感到骄傲与感动。当被问及是否还怀揣着实现大满贯的梦想时,孙颖莎坚定回答:“必须的!”采访中,她眼含热泪向邱贻可指导表示感谢,并表示希望未来能…

行为型:观察者模式

目录 1、核心思想 2、实现方式 2.1 模式结构 2.2 实现案例 3、优缺点分析 4、适用场景 5、注意事项 1、核心思想 目的&#xff1a;针对被观察对象与观察者对象之间一对多的依赖关系建立起一种行为自动触发机制&#xff0c;当被观察对象状态发生变化时主动对外发起广播&…

中国已不是美留学生第一大来源国 印度反超夺魁

中国已不是美留学生第一大来源国 印度反超夺魁!赴美留学的国际学生中,中国已不再是最多的。根据最新数据,印度已成为美国高校留学生的第一大来源国,占比29.4%(约33.1万人),而中国排在第二位,占比24.6%(约27.7万人)。两国留学生人数合计已经超过一半。过去,中国长期占…

Unity-QFramework框架学习-MVC、Command、Event、Utility、System、BindableProperty

QFramework QFramework简介 QFramework是一套渐进式、快速开发框架&#xff0c;适用于任何类型的游戏及应用项目&#xff0c;它包含一套开发架构和大量的工具集 QFramework的特性 简洁性&#xff1a;QFramework 强调代码的简洁性和易用性&#xff0c;让开发者能够快速上手&a…

【代码训练营Day02】数组part2

文章目录 长度最小的子数组螺旋矩阵II数组总结 长度最小的子数组 题目链接&#xff1a;209. 长度最小的子数组 滑动窗口法的解题思路&#xff1a; 首先初始化双指针&#xff0c;都指向数组头部end指针依次向后滑&#xff0c;每向后滑一项就加一项&#xff0c;直到满足要求达到…

千年后中国人又在举国之力挖运河 新运河时代来临

千年后中国人又在举国之力挖运河 新运河时代来临!近日,浙江《关于高水平建设“航运浙江”的实施意见》正式实施,明确提出“谋划推进浙赣运河”。这一消息再次引起热议。作为浙赣粤运河的一部分,浙赣运河途经浙江杭州、衢州和江西上饶、鹰潭、南昌等城市,规划全长约760公里…

网关Gateway

目录 Gateway作用 Gateway使用 Gateway作用 在微服务项目中&#xff0c;没有引入网关时&#xff0c;项目架构如下&#xff1a; 引入网关后&#xff0c;架构如下&#xff1a; 引入网关后&#xff0c;有如下优势&#xff1a; 1、客户端请求经过网关向后台统一分发请求&#xff0c…

Python打卡训练营-Day15-复习日

浙大疏锦行 作业&#xff1a; 尝试找到一个kaggle或者其他地方的结构化数据集&#xff0c;用之前的内容完成一个全新的项目&#xff0c;这样你也是独立完成了一个专属于自己的项目。 要求&#xff1a; 有数据地址的提供数据地址&#xff0c;没有地址的上传网盘贴出地址即可。尽…

使用MFC 写dap上位机在线烧写FLASH

1.使用BUS Hound 抓取KEIL5 正常烧写的通讯包协议 2.结束DAP 源码分析每条数据&#xff0c;主要通讯靠05 和06 3.动态加载FLM烧写算法. 最终效果

Orcad 修复Pin Name重复问题

Duplicate Pin Name “VDD” found on Package 问题描述 1、Orcad创建网表时报错,错误,描述为Pin Name重复(在Orcad中是不允许非Power的pin type的Pin Name相同的) #26 ERROR(ORCAP-36041): Duplicate Pin Name “VDD” found on Package 处理方式 修

以军称拦截也门胡塞武装发射的一枚导弹

以色列国防军当地时间29日发表声明称,以空军当天拦截了也门胡塞武装发射的一枚导弹,包括特拉维夫在内的部分以色列中部地区当天响起防空警报。有报道称,耶路撒冷传出爆炸声。以色列急救组织表示,暂时没有接到关于此次导弹袭击的人员伤亡报告。△本古里安国际机场(资料图)…

从微积分到集合论(1630-1910)(历史简介)——第3章——数学分析的出现及其基础性进展(1780-1880)(I.Grattan-Guinness)

第 3 章 数学分析的出现及其基础性进展 (The Emergence of Mathematical Analysis and its Foundational Progress,1780-1880) Grattan-Guinness 目录 3.1 数学分析及其与代数和几何的关系(Mathematical analysis and its relationship to algebra and geometry) 3.2 …

2-向量可视化

确定适用于向量的绘图类型 任务一 plot(Year,Aus_Can); 任务二 area(Year,Aus Can) 结果 任务三 stem(Year,Aus_Can) 自定义绘图属性 %任务一 plot(Year,Australia,"-ok") 结果 表示&#xff1a;&#xff08;按要求完成任务&#xff09; 用 黑色实线 连接数据点…

语音识别中的XML语法应用范例

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;XML是一种标记语言&#xff0c;用于数据传输和存储&#xff0c;而非显示。在语音识别中&#xff0c;它负责定义和结构化语音识别语法&#xff0c;通过元素如词汇、发音规则和语法限制等&#xff0c;帮助计算机理…

B站bilibili视频转文字字幕下载方法

本文将讲述介绍一种使用本地工具如何快速的下载B站的字幕为本地文本文件的方法。 通常获取B站字幕需要在浏览器中安装第三方插件&#xff0c;通过插件获取字幕。随着大模型&#xff0c;生成式AI&#xff0c;ChatGPT的应用&#xff0c;B站也提供了AI小助手对视频的内容进行总结…

计算机视觉图像处理基础系列:滤波、边缘检测与形态学操作

计算机视觉图像处理基础系列:滤波、边缘检测与形态学操作 一、前言二、滤波:图像的精细化处理​2.1 滤波基础概念​2.1.1 滤波的本质​2.1.2 图像噪声来源与类型​2.2 线性滤波​2.2.1 均值滤波​2.2.2 高斯滤波​2.3 非线性滤波​2.3.1 中值滤波​三、边缘检测:图像轮廓的精…

Kimi-Audio音频大模型介绍、本地部署与开发

目录 一、模型介绍 二、模型部署 1、创建工作空间 2、下载模型 3、下载依赖 4、下载模型库 5、下载glm4_tokenizer 6、代码编程修改 4 月 26 日&#xff0c;Moonshot AI正式宣布推出Kimi-Audio&#xff0c;一款全新的开源音频基础模型&#xff0c;旨在推动音频理解、生…

YOLO11n动态库部署实战:Windows11 + C++ + OpenCV + DDL完整封装流程详解(保姆级教程)

文章目录 前言一、Windows11CPU算法环境搭建1. 安装pycharm2. 安装python 3.8.103. 安装pytorch 1.13.04. 安装mingw64 14.2.05. 安装cmake 3.31.66. 安装 Visual Studio 2022 二、运行YOLO模型并转换为ONNX文件1. 下载yolo11源码和 ultralytics-8.3.31-py3-none-any.whl 文件2…