<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>DFS on 一共十七划</title>
		<link>https://noirzh.com/tags/dfs/</link>
		<description>Recent content in DFS on 一共十七划</description>
		<generator>Hugo</generator>
		<language>zh-CN</language>
		
		
		
		
			<lastBuildDate>Mon, 13 Nov 2023 09:17:59 +0800</lastBuildDate>
		
			<atom:link href="https://noirzh.com/tags/dfs/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>题解-每棵子树内缺失的最小基因值</title>
				<link>https://noirzh.com/minimum-time-to-eat-all-grains-solution/</link>
				<pubDate>Tue, 07 Nov 2023 15:33:00 +0800</pubDate>
				<guid>https://noirzh.com/minimum-time-to-eat-all-grains-solution/</guid>
				<description>&lt;blockquote&gt;&#xD;&#xA;&lt;p&gt;&lt;a href=&#34;https://leetcode.cn/problems/smallest-missing-genetic-value-in-each-subtree/&#34;&gt;每棵子树内缺失的最小基因值&lt;/a&gt;&lt;/p&gt;&#xD;&#xA;&lt;/blockquote&gt;&#xD;&#xA;&lt;h2&gt;题目简介&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;有一棵根节点为 0 的家族树 ，总共包含 n 个节点，节点编号为 0 到 n – 1 。给你一个下标从 0 开始的整数数组 parents ，其中 parents[i] 是节点 i 的父节点。由于节点 0 是 根 ，所以 parents[0] == -1 。&lt;/p&gt;&#xD;&#xA;&lt;p&gt;总共有 $10^5$ 个基因值，每个基因值都用 闭区间 $[1, 10^5]$ 中的一个整数表示。给你一个下标从 0 开始的整数数组 nums ，其中 nums[i] 是节点 i 的基因值，且基因值互不相同 。&lt;/p&gt;&#xD;&#xA;&lt;p&gt;请你返回一个数组 ans ，长度为 n ，其中 ans[i] 是以节点 i 为根的子树内 缺失 的 最小 基因值。&lt;/p&gt;&#xD;&#xA;&lt;p&gt;节点 x 为根的 子树 包含节点 x 和它所有的后代节点。&lt;/p&gt;&#xD;&#xA;&lt;h2&gt;思路&lt;/h2&gt;&#xD;&#xA;&lt;ul&gt;&#xD;&#xA;&lt;li&gt;在概念上与41. 缺失的第一个正数题类似,都是找数,由于本题没有要求O(1)O(1)O(1)的空间复杂度,所以用哈希表是可能的&lt;/li&gt;&#xD;&#xA;&lt;li&gt;与数组中缺失的第一个正数类似的是,如果一棵树的节点不包括1,则以该树的任意节点为根的的子树都缺少1,这是最简单的情况&lt;/li&gt;&#xD;&#xA;&lt;li&gt;对于子节点有1的才是重要讨论的情况&lt;/li&gt;&#xD;&#xA;&lt;/ul&gt;&#xD;&#xA;&lt;h2&gt;解题方法&lt;/h2&gt;&#xD;&#xA;&lt;ul&gt;&#xD;&#xA;&lt;li&gt;注意到需要处理的只是根节点到基因值为1的这一段的每个节点  &#xD;&#xA;&lt;ul&gt;&#xD;&#xA;&lt;li&gt;注意到此时讨论的只是一条链&lt;/li&gt;&#xD;&#xA;&lt;li&gt;其他的节点的缺失值一定为1&lt;/li&gt;&#xD;&#xA;&lt;/ul&gt;&#xD;&#xA;&lt;/li&gt;&#xD;&#xA;&lt;li&gt;可以用哈希表记录以该节点为根的子树包含的所有基因值,然后再每个节点都遍历一下&lt;/li&gt;&#xD;&#xA;&lt;li&gt;上述复杂度很高,再仔细观察节点的哈希表的形式,可以知道父节点的哈希表是所有子节点的合集加上自己的基因数&#xD;&#xA;&lt;ul&gt;&#xD;&#xA;&lt;li&gt;所以我们只需要自底向上遍历,维护一个哈希表就可以了&lt;/li&gt;&#xD;&#xA;&lt;li&gt;注意到父节点缺失的值不可能比子树缺失的还小,所以也需要维护一个基因数&lt;/li&gt;&#xD;&#xA;&lt;/ul&gt;&#xD;&#xA;&lt;/li&gt;&#xD;&#xA;&lt;li&gt;时间复杂度:$O(n)$&lt;/li&gt;&#xD;&#xA;&lt;li&gt;空间复杂度:$O(n)$&lt;/li&gt;&#xD;&#xA;&lt;/ul&gt;&#xD;&#xA;&lt;h2&gt;代码&lt;/h2&gt;&#xD;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-python&#34;&gt;class Solution:&#xD;&#xA;    def smallestMissingValueSubtree(self, parents: List[int], nums: List[int]) -&amp;gt; List[int]:&#xD;&#xA;        n=len(parents)&#xD;&#xA;        res=[1]*n #默认最有可能缺1&#xD;&#xA;        if 1 not in nums:&#xD;&#xA;            return res&#xD;&#xA;        graph=[[]for _ in range(n)]&#xD;&#xA;        for i in range(1,n):&#xD;&#xA;            graph[parents[i]].append(i)&#xD;&#xA;&lt;pre&gt;&lt;code&gt;    visited=set()  &#xD;&#xA;    def dfs(index):&#xD;&#xA;        visited.add(nums[index])&#xD;&#xA;        for child in graph[index]:&#xD;&#xA;            if nums[child] not in visited:&#xD;&#xA;                dfs(child)&#xD;&#xA;&#xD;&#xA;    root=nums.index(1) #找分界点&#xD;&#xA;    now=2&#xD;&#xA;    while root&amp;amp;gt;=0: #自底向上递归查找&#xD;&#xA;        dfs(root)&#xD;&#xA;        while now in visited:&#xD;&#xA;            now+=1&#xD;&#xA;        res[root]=now&#xD;&#xA;        root=parents[root]&#xD;&#xA;    return res&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2&gt;其他&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;这个理论上不能用与41题类似的将数组本身化为哈希表的操作,不然代码的复杂性很高,而且也不好理解&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
