【每日一题】每棵子树内缺失的最小基因值

news2024/9/20 22:48:44

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:DFS
  • 写在最后

Tag

【dfs】【树】【2023-10-31】


题目来源

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


题目解读

找出每棵子树内缺失的最小基因值。


解题思路

方法一:DFS

找到基因值为 1 的节点,从该点出发向上到根节点的所有节点才是需要处理的节点,其他节点的缺失的最小基因值都为 1。缺失的最小值是不在子树中的最小正整数。

因为树中节点的基因值不会有重复的,所以基因值为 1 的节点仅有一个,从该点出发向上到根节点的所有节点的最小基因值会受到该节点的最小基因值影响。而其他节点和基因值为 1 的节点没有父子关系,就不会受其影响,并且这些节点的基因值都大于等于 2,因此它们的最小基因值都为 1

于是维护一个答案数组 res,初始值都为 1。我们从基因值为 1 的节点出发,自底向上的更新祖先节点的缺失的最小基因值。

具体地,需要根据父节点数组 parents 建图;然后查找基因值为 1 的节点在树中的位置 node,从该位置出发向上更新 res,具体实现见代码以及注释。

实现代码

class Solution {
public:
    vector<int> smallestMissingValueSubtree(vector<int>& parents, vector<int>& nums) {
        int n = nums.size();
        vector<int> res(n, 1);

        // 查找基因值为 1 的节点
        auto it = find(nums.begin(), nums.end(), 1);
        if (it == nums.end()) return res;   // 无基因值为 1 的节点

        // 根据父节点关系建图
        vector<vector<int>> g(n);
        for (int i = 1; i < n; ++i) {
            g[parents[i]].push_back(i);
        }
        
        unordered_set<int> vis; // 基因值是否遍历过
        // 记录节点 x 及其所有子节点的基因值
        function<void(int)> dfs = [&](int x) -> void {
            vis.insert(nums[x]);
            for (int son : g[x]) {
                if (!vis.count(nums[son])) {
                    dfs(son);
                }
            }
        };

        int val = 2;    // 缺失的最小基因值
        int node = it - nums.begin();
        while (node >= 0) {
            dfs(node);
            while(vis.count(val)) ++val;
            res[node] = val;
            node = parents[node];
        }
        return res;
    }
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n) n n n 为数组 nums 的长度。

空间复杂度: O ( n ) O(n) O(n)


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

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

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

相关文章

大中小企业对CRM系统的需求

在以前&#xff0c;CRM客户管理系统是大型企业的专属。如今&#xff0c;不论何种规模的企业都能够使用CRM系统。市面上的CRM有着丰富的功能类型&#xff0c;管理者可以从企业自身规模出发&#xff0c;选择适合的CRM系统。下面说说&#xff0c;大中小企业对CRM系统的需求。 一句…

Linux各个发行版之间的关系

Linux各个发行版之间的关系 可以查看链接&#xff1a;Linux Timeline 链接中可以下载PNG或者SVG图片

Redis Cluster (Redis 集群),使用Redis自带的集群功能搭建无主模式集群

文章目录 一、概述二、模拟配置说明三、脚本方式创建 Redis Cluster3.1 配置创建脚本3.2 启动集群实例3.3 创建集群3.4 测试集群3.5 停止集群实例3.6 删除&#xff08;清空&#xff09;集群 四、手动创建集群 Redis Cluster4.1 启动集群实例4.2 手动创建集群4.4 测试集群 五、集…

Studio One6最新版本保姆级下载安装教程

根据使用者情况表明Vocoder一个与众不同的创意游乐场&#xff0c;它能够将两个输入信号组合在一起&#xff0c;创建由一系列带通滤波器处理的最新声音&#xff0c;将您的声音或任何音频源转换为独特的合成器或效果器&#xff0c;声码器将激发您玩转音频的无限创意。值得肯定的是…

【Python 常用脚本及命令系列 9 -- 图片文字识别 EasyOCR使用】

文章目录 1.1 EasyOCR 介绍1.1.1 EasyOCR 安装1.1.2 EasyOCR 使用方法1.1.2.1 EasyOCR 支持的语言种类1.1.2.2 EasyOCR 支持的图像格式 EasyOCR 提高图片文字识别正确率1.3 问题总结 1.1 EasyOCR 介绍 Python中有一个不错的OCR库-EasyOCR&#xff0c;在GitHub已有9700 star。它…

对话式AI驱动的计算机辅助设计【CAD】

大型语言模型 (LLM) 为 CAD 软件公司提供了通过对话式 AI 增强设计工作流程的新机会。 工程师无需浏览复杂的菜单&#xff0c;而是可以用简单的语言描述需求并接收由集成数据支持的智能响应。 例如&#xff0c;工程师可以通过询问“2 盎司以下的铝支架”来查询零件数据库。 LL…

荣获IoT最具潜力企业奖,美格智能引领AIoT应用变革

10月30日&#xff0c;2023第十届IoT大会在深圳盛大开幕。大会同期举办第八届IoT创新奖评选&#xff0c;美格智能顺利通过层层遴选&#xff0c;获颁“IoT最具潜力企业奖”。这一荣誉不仅是对公司目前研发水平、产品服务、业务发展及综合实力的高度认可&#xff0c;更是对创新能力…

基于SSM的高校疫情防控出入信息管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

2023年上海市初中生“爱我中华”主题征文的详细框架(续)

“中文自修杯”2023年上海市初中生“爱我中华”主题征文活动自由报名最后提交时间为今天&#xff08;10月31日&#xff09;&#xff0c;请记得及时提交文稿。 前一篇文章&#xff0c;六分成长介绍了大家在提交征文时候的三个困惑以及解决方法。这篇文章继续为大家列出后面三个主…

springboot+vue基于Hadoop短视频流量数据分析与可视化系统的设计与实现【内含源码+文档+部署教程】

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

学习视频剪辑:如何从指定时段快速抽出视频图片!高效技巧分享

随着数字媒体的普及&#xff0c;越来越多的人开始接触视频剪辑。在视频剪辑过程中&#xff0c;有时候我们需要从指定时段快速抽出视频图片。这不仅可以帮助我们提高剪辑效率&#xff0c;还可以让我们的视频更加丰富多彩。本文将分享一些高效技巧&#xff0c;帮助你轻松实现从指…

关键点检测、姿态识别、目标检测、车牌识别等项目部署代码+数据集汇总

一、AI健身计数 1、图片视频检测 &#xff08;cpu运行&#xff09;&#xff1a; 注&#xff1a;左上角为fps&#xff0c;左下角为次数统计。 1.哑铃弯举&#xff1a;12&#xff0c;14&#xff0c;16 详细环境安装教程&#xff1a;pyqt5AI健身CPU实时检测mediapipe 可视化界面…

react-组件生命周期

一、生命周期阶段 官方文档&#xff1a;https://zh-hans.legacy.reactjs.org/docs/react-component.html React组件生命周期可分为三个阶段&#xff1a;挂载、更新、卸载 挂载&#xff1a;当组件实例被创建并插入 DOM 中时。其生命周期调用顺序如下&#xff1a; constructor()s…

【Java每日一题】——第四十四题:综合案例:编程模拟智能手机和普通手机功能。(2023.10.31)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

广西建筑模板厂家:行业先锋,品质之选

在建筑行业繁荣发展的今天&#xff0c;广西建筑模板厂家作为产业链中的关键环节&#xff0c;扮演着举足轻重的角色。这些厂家以卓越的创新力、精湛的技术和优质的客户服务&#xff0c;为建筑行业提供了无数可靠的解决方案。 一、创新引领进步广西建筑模板厂家始终坚持创新是推动…

如何使用内网穿透远程访问Linux SVN服务?

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

基于javaweb的吃了吗管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

Oracle查询表结构、索引和备注

1, ORACLE 查询表结构 SELECT table_name, column_name, data_type,DATA_LENGTH,COLUMN_ID,user_tab_comments,user_col_comments FROM USER_TAB_COLUMNS WHERE table_name upper(T_Acc_Settle_Account);SELECT * FROM user_tab_columns WHERE table_nameT_Acc_Settle_Accoun…

C++进阶语法——STL 标准模板库(上)(Standard Template Library)【学习笔记(六)】

文章目录 STL 标准模板库1、 STL简介2、STL容器的类别3、STL迭代器的类别4、STL算法的类别5、泛型编程&#xff08;generic programming&#xff09;6、C模板&#xff08;template&#xff09;6.1 函数模板&#xff08;function template&#xff09;6.2 类模板&#xff08;cla…

QVD-2023-19300:致远M1 usertokenservice反序列化RCE漏洞复现

文章目录 致远M1 usertokenservice反序列化RCE漏洞(QVD-2023-19300)复现0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 致远M1 usertokenservice反序列化RCE漏洞(QVD-2023-19300)复现 0x01 前言 免责声明&…