LeetCode-1766. 互质树【树 深度优先搜索 广度优先搜索 数组 数学 数论】

news2025/2/28 3:55:46

LeetCode-1766. 互质树【树 深度优先搜索 广度优先搜索 数组 数学 数论】

  • 题目描述:
  • 解题思路一:DFS 中记录节点值的深度和编号,回溯写法。关键点是1 <= nums[i] <= 50
  • 解题思路二:0
  • 解题思路三:0

题目描述:

给你一个 n 个节点的树(也就是一个无环连通无向图),节点编号从 0 到 n - 1 ,且恰好有 n - 1 条边,每个节点有一个值。树的 根节点 为 0 号点。

给你一个整数数组 nums 和一个二维数组 edges 来表示这棵树。nums[i] 表示第 i 个点的值,edges[j] = [uj, vj] 表示节点 uj 和节点 vj 在树中有一条边。

当 gcd(x, y) == 1 ,我们称两个数 x 和 y 是 互质的 ,其中 gcd(x, y) 是 x 和 y 的 最大公约数 。

从节点 i 到 根 最短路径上的点都是节点 i 的祖先节点。一个节点 不是 它自己的祖先节点。

请你返回一个大小为 n 的数组 ans ,其中 ans[i]是离节点 i 最近的祖先节点且满足 nums[i] 和 nums[ans[i]] 是 互质的 ,如果不存在这样的祖先节点,ans[i] 为 -1 。

示例 1:
在这里插入图片描述
输入:nums = [2,3,3,2], edges = [[0,1],[1,2],[1,3]]
输出:[-1,0,0,1]
解释:上图中,每个节点的值在括号中表示。

  • 节点 0 没有互质祖先。
  • 节点 1 只有一个祖先节点 0 。它们的值是互质的(gcd(2,3) == 1)。
  • 节点 2 有两个祖先节点,分别是节点 1 和节点 0 。节点 1 的值与它的值不是互质的(gcd(3,3) == 3)但节点 0 的值是互质的(gcd(2,3) == 1),所以节点 0 是最近的符合要求的祖先节点。
  • 节点 3 有两个祖先节点,分别是节点 1 和节点 0 。它与节点 1 互质(gcd(3,2) == 1),所以节点 1 是离它最近的符合要求的祖先节点。
    示例 2:
    在这里插入图片描述
    输入:nums = [5,6,10,2,3,6,15], edges = [[0,1],[0,2],[1,3],[1,4],[2,5],[2,6]]
    输出:[-1,0,-1,0,0,0,-1]

提示:

nums.length == n
1 <= nums[i] <= 50
1 <= n <= 105
edges.length == n - 1
edges[j].length == 2
0 <= uj, vj < n
uj != vj

解题思路一:DFS 中记录节点值的深度和编号,回溯写法。关键点是1 <= nums[i] <= 50

对于节点 x,我们需要计算节点值与 nums[x] 互质的最近祖先节点是哪个。

最暴力的做法是,枚举 x 的所有祖先节点。但如果这棵树是一条链,枚举 x 的所有祖先节点需要 O(n) 的时间,每个点都这样枚举的话,总共需要 O(n2) 的时间,太慢了。

注意到,所有节点的节点值都不超过 50,我们可以枚举 [1,50] 中与 nums[x] 互质的数。由于要计算的是「最近」祖先,对于节点值相同的祖先,只需枚举深度最大的。因此,对于节点 x,我们至多枚举它的 50 个祖先。这样总共只需要 O(nU) 的时间,其中 U=50。

具体来说,我们需要在递归这棵树的同时,维护两组信息:

  • valDepth 数组。其中 valDepth[j] 保存节点值等于 j 的最近祖先的深度。
  • valNodeId 数组。其中 valNodeId[j] 保存节点值等于 j 的最近祖先的节点编号。

设当前节点值为 val=nums[x],我们枚举 [1,50] 中与 val互质的数字 j,计算出 valDepth[j] 的最大值,及其对应的节点编号,即为答案 ans[x]。

代码实现时,可以预处理 [1,50]中有哪些数对是互质的。

# 预处理:coprime[i] 保存 [1, MX) 中与 i 互质的所有元素
MX = 51
coprime = [[j for j in range(1, MX) if gcd(i, j) == 1]
            for i in range(MX)]
class Solution:
    def getCoprimes(self, nums: List[int], edges: List[List[int]]) -> List[int]:
        n = len(nums)
        g = [[] for _ in range(n)]
        for x, y in edges:
            g[x].append(y)
            g[y].append(x)

        ans = [0] * n
        val_depth_id = [(-1, -1)] * MX # 包含深度和节点编号
        def dfs(x: int, fa: int, depth: int) -> None:
            val = nums[x] # x 的节点值
            # 计算与 val 互质的祖先节点值中,节点深度最大的节点编号
            ans[x] = max(val_depth_id[j] for j in coprime[val])[1]
            tmp = val_depth_id[val]  # 用于恢复现场
            val_depth_id[val] = (depth, x)  # 保存 val 对应的节点深度和节点编号
            for y in g[x]:
                if y != fa:
                    dfs(y, x, depth + 1)
            val_depth_id[val] = tmp # 恢复现场
        dfs(0, -1, 0)
        return ans

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

解题思路二:0


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

解题思路三:0


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

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

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

相关文章

心跳机制原理学习

心跳机制 应用场景&#xff1a; 在长连接下&#xff0c;有可能很长一段时间都没有数据往来。理论上说&#xff0c;这个连接是一直保持连接的&#xff0c;但是实际情况中&#xff0c;如果中间节点出现什么故障是难以知道的。更要命的是&#xff0c;有的节点&#xff08;防火墙…

实验5 流程图和盒图ns图

一、实验目的 通过绘制流程图和盒图&#xff0c;熟练掌握流程图和盒图的基本原理。 能对简单问题进行流程图和盒图的分析&#xff0c;独立地完成流程图和盒图设计。 二、实验项目内容&#xff08;实验题目&#xff09; 1、用Microsoft Visio绘制下列程序的程序流程图。 若…

Go语言mac环境搭建详解

Go语言mac环境搭建详解见视频&#xff0c;视频下方也有讲解具体的操作步骤。 Golang Mac电脑环境搭建、开发工具Vscode配置 Go语言mac环境搭建步骤如下&#xff1a; 1、下载安装Golang Go官网下载地址&#xff1a;https://golang.org/dl/ Go官方镜像站&#xff08;推荐&…

一线城市嵌入式软件开发工程师每年调薪幅度能有多少?

15%对于刚入职的新人来说确实有可能有&#xff0c;如果你的底薪比较低的话。不过后面随着你工资变高&#xff0c;这个幅度会越来越趋向0%。在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「 嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在…

GEE数据集——汉森全球森林变化数据集Hansen Global Forest Change v1.11 (2000-2023)

Hansen Global Forest Change v1.11 (2000-2023) 对大地遥感卫星图像进行时间序列分析以确定全球森林范围和变化特征的结果。 第一个 "和 "最后一个 "波段是大地遥感卫星光谱波段&#xff08;红、近红外、SWIR1 和 SWIR2&#xff09;的第一个和最后一个可用年…

python镜像安装(ios、windows)

如果你在使用Python时发现官方网站下载速度过慢&#xff0c;可以考虑使用国内的Python镜像源下载Python。国内的Python镜像源可以提供更快的下载速度和更好的下载体验。 以下是使用国内Python镜像源下载Python的步骤&#xff1a; 步骤 1&#xff1a;选择Python版本 首先&…

知识图谱的挑战与机遇

知识图谱的挑战与机遇 引言 欢迎来到知识图谱的世界&#xff0c;这是一片未被充分挖掘的宝地&#xff0c;充满了挑战与机遇。本篇文章旨在深入探讨知识图谱领域面临的主要挑战&#xff0c;并预测未来可能的发展机遇。知识图谱以其独特的方式整合和呈现信息&#xff0c;已经成为…

Linux进阶篇:firewalld详解——firewalld 的概念作用以及如何使用

Linux firewalld详解——firewalld 的概念&作用以及如何使用 在这篇文章中&#xff0c;我们将详细介绍Linux系统中的firewalld&#xff0c;它是一款强大的防火墙管理工具。我们将介绍firewalld的基本概念和作用&#xff0c;并通过实例演示如何使用它来保护您的系统。 一、…

VMware虚拟机的安装指南

前言 在数字化时代&#xff0c;虚拟机技术为我们提供了无限可能&#xff0c;让一台计算机同时运行多个操作系统成为现实。VMware作为知名的虚拟化解决方案之一&#xff0c;其强大的功能和易用性备受推崇。本文将详细介绍如何安装VMware虚拟机&#xff0c;让您轻松进入虚拟化的…

嵌入式需要模电数电的哪些内容?

1 数电知识 1.1 布尔代数和逻辑门 了解布尔代数的基本概念和逻辑门的工作原理&#xff0c;包括与门、或门、非门、与非门、或非门、异或门等。 1.2 时序逻辑和时钟信号在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「 嵌入式的资料从专业入门到高级教…

搭建第一个Web服务器(在eclipse或idea上部署Tomcat服务器)

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

客户关系CRM管理系统源码 企业crm管理系统

客户关系CRM管理系统源码 企业crm管理系统 系统功能介绍 1、 公海管理&#xff1a;公海类型、客户公海。 2、 线索管理&#xff1a;我的线索、线索列表、线索状态、线索来源。 3、 客户管理&#xff1a;我的客户、客户列表、成交客户、行业类别、预查、地区列表、客户状态、…

抗酸碱耐高温小型PFA溶样瓶可搭配电热板用于样品前处理实验

PFA溶样罐&#xff0c;也叫PFA管形瓶、可溶性聚四氟乙烯溶样罐、消解瓶等&#xff0c;常用于地质地矿、地球化学、土壤微生物等样品分析消解实验&#xff0c;可搭配石墨消解仪、电热板使用。广泛适用于痕量分析、环境监测、重金属检测、半导体、新材料、新能源等。 规格参考&a…

数据仓库的ELT/ETL

ETL 和 ELT 有很多共同点&#xff0c;从本质上讲&#xff0c;每种集成方法都可以将数据从源端抽取到数据仓库中&#xff0c;两者的区别在于数据在哪里进行转换。 01 ETL ETL – 抽取、转换、加载 从不同的数据源抽取信息&#xff0c;将其转换为根据业务定义的格式&#xff0…

集群服务器使用

查看剩余资源&#xff1a;sinfo -O Nodehost,Gres:.30,GresUsed:.45 第二列是总资源 第三列是占用量 申请资源&#xff1a;salloc -N 1 -n 1 -p normal --gresgpu:NVIDIAGeForceGTX1080Ti1 gres的名字来源于sinfo 查看任务情况 squeue JOBID NODES 连接资源 ssh NODES …

The C programming language (second edition,KR) exercise(CHAPTER 3)

E x c e r c i s e 3 − 1 Excercise\quad 3-1 Excercise3−1&#xff1a;输出结果如图1所示&#xff0c;这里故意让二分搜索算法去寻找一个在数组中不存在在的数&#xff0c;然后去看两种二分搜索算法分别所花费的时间的大小&#xff0c;为了使得所花费的时间更具有可分辨性&a…

curl: (60) Peer‘s Certificate issuer is not recognized curl请求报错

此种情况多发生在自签名的证书或者证书和域名不对&#xff0c;报错含义是签发证书机构未经认证&#xff0c;无法识别。解决办法就是替换证书&#xff08;补充证书机构&#xff09;文件就好&#xff0c;如果没有可用的证书可以去Gworg申请一个。

记录我第一场面了40min+的面试

中冶赛迪信息技术(重庆)有限公司 国企 首先3/24投递的&#xff0c;4/10打了电话问是否接受劳务派遣&#xff0c;我当时不知道劳务派遣什么意思&#xff0c;问了和售前售后是不是类似&#xff0c;得到了不大一样的回答&#xff0c;后面加了微信&#xff0c;定了11开始面试。 这…

【计算机考研】数据结构都不会,没有思路,怎么办?

基础阶段&#xff0c;并不需要过于专门地练习算法。重点应该放在对各种数据结构原理的深入理解上&#xff0c;也可以说先学会做选择题、应用题。 因为在考试中&#xff0c;大部分的算法题目&#xff0c;尤其是大题&#xff0c;往往可以通过简单的暴力解决方案得到较高的分数。…

【Java8新特性】四、强大的Stream api

​ 这里写自定义目录标题 一、了解Stream二、流(stream)到底是什么&#xff1f;三、Stream操作的三个步骤四、创建Stream的四种方式五、Stream 的中间操作1、筛选和切片2、map 映射3、排序 六、Stream 的终止操作1、查找和匹配2、归约3、收集 一、了解Stream Stream是Java8中…