leetcode_2003 每棵子树内缺失的最小基因值

1. 题意

给定一颗树,求所有子树的最小基因值。
最小基因值定义为,该树的所有节点组成的集合中未出现的最小正整数。

每颗子树内缺失的最小基因值

2. 题解

2.1 启发式合并

直接递归求出左右子树的所有可能值,与根节点进行合并,注意始终是大集合合并小集合。即启发式合并。

  • 一个小优化,父节点的最小基因值必定大于等于子节点
class Solution {
public:vector<int> smallestMissingValueSubtree(vector<int>& parents, vector<int>& nums) {int sz = parents.size();vector<int> res(sz, 1);vector<vector<int>> childs(sz);int kNode = -1;for ( int i = 0; i < sz; ++i) {if ( parents[i] >= 0)childs[parents[i]].push_back(i);if ( nums[i] == 1)kNode = i;}vector<int> vis(sz, 0);unordered_set<int> um;function<void(int)> dfs = [&](int rt) {if (vis[rt])return;vis[rt] = 1;um.insert(nums[rt]);for (int v:childs[rt])dfs(v);};int cnt = 1;while ( kNode != -1) {dfs(kNode);while ( um.count(cnt))++cnt;res[kNode] = cnt;kNode = parents[kNode];}return res;}
};
2.2 找出值为1的节点

实际上不难得出,对于所有子节点不包含 1的树,他们的最小基因值为1

而对于以1为祖先节点的子节点来说,他们的最小基因值也为1

只需要考虑值为1的祖先节点的最小基因值;所以我们可以先找到值为1的节点,递归求出他的所有

子节点值集合,自底向上求出祖先,我们可以vis标记这个节点是否被求过来减少重复。

class Solution {
public:vector<int> smallestMissingValueSubtree(vector<int>& parents, vector<int>& nums) {int sz = parents.size();vector<int> res(sz, 1);vector<vector<int>> childs(sz);int kNode = -1;for ( int i = 0; i < sz; ++i) {if ( parents[i] >= 0)childs[parents[i]].push_back(i);if ( nums[i] == 1)kNode = i;}vector<int> vis(sz, 0);unordered_set<int> um;function<void(int)> dfs = [&](int rt) {if (vis[rt])return;vis[rt] = 1;um.insert(nums[rt]);for (int v:childs[rt])dfs(v);};int cnt = 1;while ( kNode != -1) {dfs(kNode);while ( um.count(cnt))++cnt;res[kNode] = cnt;kNode = parents[kNode];}return res;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/126000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解udp

1.再谈端口号 1.1复习 我们上一篇谈了很久的应用层的http&#xff0c;并在此前我们使用socket编程写了一个能相互通信的客户端与服务端&#xff0c;但是我们也只是粗略的理解了一下tcp和udp在编程过程中所形成的差异性&#xff0c;并没有实质去了解一下其详细内容&#xff0c;…

家政服务系统小程序app开发功能架构;

家政服务小程序系统&#xff0c;轻松搭建上门服务小程序。支持H5与小程序双端&#xff0c;还能DIY页面。根据您的需求&#xff0c;我们可定制开发家政服务小程序系统。想添加多种服务类目、优惠专区以及IM即时沟通功能&#xff1f;没问题&#xff0c;我们支持&#xff01;想要快…

Java--枚举类型

Java中枚举类型可以取代一般的常量定义方式&#xff0c;可以将常量封装在类或接口中&#xff1b;枚举类型本质上还是以类的形式存在的&#xff0c;枚举类型继承于java.lang.Enum类&#xff0c;定义一个枚举类型时&#xff0c;每一个枚举类型成员都可以看做是枚举类型的一个实例…

【计算机网络笔记】传输层——可靠数据传输原理之Rdt协议

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

局域网内两台电脑共享文件夹(通过网线直连共享数据)

文章目录 2.设置共享文件夹3.访问共享文件夹 1.将两台电脑置于同一局域网下 用网线将两台电脑连接关闭两台电脑防火墙将两台电脑IP地址设置在同一局域网下 测试是否在同一局域网下&#xff0c;使用ping命令 ping 192.168.0.122.设置共享文件夹 选择想要共享的文件夹&#xff…

uniapp跨页面传递数据的几种方式

跨页面传递数据是在移动应用开发中非常常见和重要的功能。UniApp作为一个跨平台框架&#xff0c;提供了多种方式来实现数据的传递。下面将介绍几种常见的跨页面传递数据的方式&#xff0c;并给出相应的示例代码。 URL参数传递&#xff1a; 在源页面&#xff08;例如pages/ind…

ffi-napi安装使用 问题记录

第一步先安装 npm install -g node-gyp 这个软件是node下&#xff0c;用来编译node插件软件&#xff0c;也就是我们要安装的ffi-napi的&#xff0c;因为ffi-napi是调用c&#xff0c;所以这个软件&#xff0c;在不同平台&#xff0c;linux,windows&#xff0c;肯定要不同的代码才…

微服务-统一网关Gateway

网关的作用 对用户请求做身份认证、权限校验将用户请求路由到微服务&#xff0c;并实现负载均衡对用户请求做限流 搭建网关服务 创建新module&#xff0c;命名为Gateway&#xff0c;引入依赖&#xff08;1.SpringCloudGateway依赖&#xff1b;2.Eureka客户端依赖或者nacos的服…

git命令清单

一、设置和配置 1.初始化一个新的仓库&#xff1a; git init2.克隆&#xff08;Clone&#xff09;一个远程仓库到本地&#xff1a; git clone <repository_url>3.配置用户信息&#xff1a; git config --global user.name "Your Name" git config --global…

CentOS 安装 Hadoop Local (Standalone) Mode 单机模式

CentOS 安装 Hadoop Local (Standalone) Mode 单机模式 Hadoop Local (Standalone) Mode 单机模式 1. 修改yum源 并升级内核和软件 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repoyum clean allyum makecacheyum -y update2. 安…

科学化决策数据分析,先从量化开始

在当今信息爆炸的时代&#xff0c;数据已经成为我们生活和工作中不可或缺的一部分。在各行各业&#xff0c;人们越来越依赖数据来指导决策和优化业务。在这个背景下&#xff0c;量化成为了一种重要的方法论&#xff0c;通过收集、分析和解读数据&#xff0c;为我们提供了更准确…

【新品首发】DPEasy,让数据库安全风险无所遁形!

就在今天&#xff0c;DPEasy 正式出道啦&#xff01;&#xff01;&#xff01; DPEasy 是由杭州图尔兹信息技术有限公司自主研发的一款高效的数据库安全风险扫描工具&#xff0c;旨在帮助大家发现并分析出数据库可能面临的安全威胁。同时&#xff0c;在不影响应用运行的情况下…

【Java 进阶篇】深入理解 Java Response:从基础到高级

HTTP响应&#xff08;Response&#xff09;是Web开发中的一个关键概念&#xff0c;它是服务器向客户端&#xff08;通常是浏览器&#xff09;返回数据的方式。理解如何在Java中处理和构建HTTP响应是开发Web应用程序的重要一部分。本文将从基础知识到高级技巧&#xff0c;详细介…

Qt QWidget、QDialog、QMainWindow的区别

QWidget QWidget是Qt框架中最基础的窗口类&#xff0c;可以理解为用户界面的最基本单元。QWidget类提供了一个空白窗口&#xff0c;可以通过继承该类来创建自定义的窗口类。QWidget类提供了基本的窗口属性和方法&#xff0c;如大小、位置、标题、图标等。 QDialog QDialog是…

【设计模式】第18节:行为型模式之“迭代器模式”

一、简介 迭代器模式&#xff08;Iterator Design Pattern&#xff09;&#xff0c;也叫作游标模式&#xff08;Cursor Design Pattern&#xff09;。 在通过迭代器来遍历集合元素的同时&#xff0c;增加或者删除集合中的元素&#xff0c;有可能会导致某个元素被重复遍历或遍…

Flask Shell 操作 SQLite

一、前言 这段时间在玩Flask Web&#xff0c;发现用Flask Shell去操作SQLite还是比较方便的。今天简单地介绍一下。 二、SQLite SQLite是一种嵌入式数据库&#xff0c;它的数据库就是一个文件&#xff0c;处理速度快&#xff0c;经常被集成在各种应用程序中&#xff0c;在IO…

MySql查询当天、本周、本月、本季度、本年的数据

1.今天 SELECT * FROM 表名 WHERE TO_DAYS(时间字段名) TO_DAYS(NOW()); 2.昨天 SELECT * FROM 表名 WHERE TO_DAYS(NOW()) - TO_DAYS(时间字段名) < 1; 3.本周 SELECT * FROM 表名 WHERE YEARWEEK(DATE_FORMAT(时间字段名,%Y-%m-%d)) YEARWEEK(NOW()); 4.上周 SEL…

安装OPENCMS过程记录

今天尝试安装个人网站&#xff0c;或者说是内容管理系统&#xff0c;wordpress 是PHP的&#xff0c;所以上网找了一个免费的&#xff0c;在知乎上基于Java的开源CMS有哪些推荐&#xff0c;各自特点是什么 - 知乎 (zhihu.com) 找了这个opencms&#xff0c;据说是免费&#xff0…

什么是AUTOSAR ComStack,AUTOSAR架构中,CAN通信堆栈CAN Communication Stack介绍

AUTOSAR&#xff08;Automotive Open System Architecture&#xff09;ComStack指的是AUTOSAR架构中的通信堆栈。在AUTOSAR体系结构中&#xff0c;ComStack是指用于不同软件组件&#xff08;如应用软件、基础软件等&#xff09;之间进行通信的一组协议和服务。 在AUTOSAR架构中…

对象存储那点事

在很长的一段时间里&#xff0c;DAS、SAN 和 NAS 这三种架构几乎统治了数据存储市场。所有行业用户的数据存储需求&#xff0c;都是在这三者中进行选择。 然而&#xff0c;随着时代的发展&#xff0c;一种新的数据存储形态诞生&#xff0c;开始挑战前面三者的垄断地位。没错&am…