2003. 每棵子树内缺失的最小基因值 - 力扣(LeetCode)
C++代码:需要注意的是从下往上走,DFS算法。
class Solution {
public:
vector<int> smallestMissingValueSubtree(vector<int>& parents, vector<int>& nums) {
int n=parents.size();
vector<int> res(n,1);
//先找到值为1的基因组
auto it=find(nums.begin(),nums.end(),1);
//没有就返回 基因值全为1
if(it==nums.end()){
return res;
}
//记录子节点 邻接表
vector<vector<int>> p(n);
for(int i=1;i<n;i++){
p[parents[i]].push_back(i);
}
unordered_set<int> vis;
//现在最小基因组为2
int mex=2;
//从基因值为1的节点开始行动
int node=it-nums.begin();
while(node>=0){
dfs(node,vis,nums,p);
//找到该字节点下没有出现的基因值
while(vis.count(mex)){
mex++;
}
res[node]=mex;
//往上走
node=parents[node];
}
return res;
}
//遍历 获得该节点下的所有子节点的基因值
void dfs(int x,unordered_set<int>&vis,vector<int>&nums,vector<vector<int>>&p){
vis.insert(nums[x]);
for(int son:p[x]){
if(!vis.count(nums[son])){
dfs(son,vis,nums,p);
}
}
}
};
Python3代码:
class Solution:
def smallestMissingValueSubtree(self, parents: List[int], nums: List[int]) -> List[int]:
n=len(parents)
res=[1]*n
if 1 not in nums:
return res
p=[[]for _ in range(n)]
for i in range(1,n):
p[parents[i]].append(i)
vis=set()
def dfs(x:int)->None:
vis.add(nums[x])
for son in p[x]:
if nums[son] not in vis:
dfs(son)
mex=2
node=nums.index(1)
while node>=0:
dfs(node)
while mex in vis:
mex+=1
res[node]=mex
node=parents[node]
return res