Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 29d4633

Browse files
authored
feat: add solutions to lc problem: No.2003 (doocs#1856)
No.2003.Smallest Missing Genetic Value in Each Subtree
1 parent a1cb397 commit 29d4633

File tree

8 files changed

+828
-1
lines changed

8 files changed

+828
-1
lines changed

solution/2000-2099/2003.Smallest Missing Genetic Value in Each Subtree/README.md

Lines changed: 288 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,22 +69,309 @@
6969

7070
<!-- 这里可写通用的实现逻辑 -->
7171

72+
**方法一:DFS**
73+
74+
我们注意到,每个节点的基因值互不相同,因此,我们只需要找到基因值为 $1$ 的节点 $idx$,那么除了从节点 $idx$ 到根节点 $0$ 的每个节点,其它节点的答案都是 $1$。
75+
76+
因此,我们初始化答案数组 $ans$ 为 $[1,1,...,1]$,然后我们的重点就在于求出节点 $idx$ 到根节点 $0$ 的路径上的每个节点的答案。
77+
78+
我们可以从节点 $idx$ 开始,通过深度优先搜索的方式,标记以 $idx$ 作为根节点的子树中出现过的基因值,记录在数组 $has$ 中。搜索过程中,我们用一个数组 $vis$ 标记已经访问过的节点,防止重复访问。
79+
80+
接下来,我们从 $i=2$ 开始,不断向后寻找第一个没有出现过的基因值,即为节点 $idx$ 的答案。这里 $i$ 是严格递增的,因为基因值互不相同,所以我们一定能在 $[1,..n+1]$ 中找到一个没有出现过的基因值。
81+
82+
然后,我们更新节点 $idx$ 的答案,即 $ans[idx]=i$,并将 $idx$ 更新为其父节点,继续上述过程,直到 $idx=-1$,即到达了根节点 $0$。
83+
84+
最后,我们返回答案数组 $ans$ 即可。
85+
86+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是节点的数量。
87+
7288
<!-- tabs:start -->
7389

7490
### **Python3**
7591

7692
<!-- 这里可写当前语言的特殊实现逻辑 -->
7793

7894
```python
79-
95+
class Solution:
96+
def smallestMissingValueSubtree(
97+
self, parents: List[int], nums: List[int]
98+
) -> List[int]:
99+
def dfs(i: int):
100+
if vis[i]:
101+
return
102+
vis[i] = True
103+
if nums[i] < len(has):
104+
has[nums[i]] = True
105+
for j in g[i]:
106+
dfs(j)
107+
108+
n = len(nums)
109+
ans = [1] * n
110+
g = [[] for _ in range(n)]
111+
idx = -1
112+
for i, p in enumerate(parents):
113+
if i:
114+
g[p].append(i)
115+
if nums[i] == 1:
116+
idx = i
117+
if idx == -1:
118+
return ans
119+
vis = [False] * n
120+
has = [False] * (n + 2)
121+
i = 2
122+
while idx != -1:
123+
dfs(idx)
124+
while has[i]:
125+
i += 1
126+
ans[idx] = i
127+
idx = parents[idx]
128+
return ans
80129
```
81130

82131
### **Java**
83132

84133
<!-- 这里可写当前语言的特殊实现逻辑 -->
85134

86135
```java
136+
class Solution {
137+
private List<Integer>[] g;
138+
private boolean[] vis;
139+
private boolean[] has;
140+
private int[] nums;
141+
142+
public int[] smallestMissingValueSubtree(int[] parents, int[] nums) {
143+
int n = nums.length;
144+
this.nums = nums;
145+
g = new List[n];
146+
vis = new boolean[n];
147+
has = new boolean[n + 2];
148+
Arrays.setAll(g, i -> new ArrayList<>());
149+
int idx = -1;
150+
for (int i = 0; i < n; ++i) {
151+
if (i > 0) {
152+
g[parents[i]].add(i);
153+
}
154+
if (nums[i] == 1) {
155+
idx = i;
156+
}
157+
}
158+
int[] ans = new int[n];
159+
Arrays.fill(ans, 1);
160+
if (idx == -1) {
161+
return ans;
162+
}
163+
for (int i = 2; idx != -1; idx = parents[idx]) {
164+
dfs(idx);
165+
while (has[i]) {
166+
++i;
167+
}
168+
ans[idx] = i;
169+
}
170+
return ans;
171+
}
172+
173+
private void dfs(int i) {
174+
if (vis[i]) {
175+
return;
176+
}
177+
vis[i] = true;
178+
if (nums[i] < has.length) {
179+
has[nums[i]] = true;
180+
}
181+
for (int j : g[i]) {
182+
dfs(j);
183+
}
184+
}
185+
}
186+
```
187+
188+
### **C++**
189+
190+
```cpp
191+
class Solution {
192+
public:
193+
vector<int> smallestMissingValueSubtree(vector<int>& parents, vector<int>& nums) {
194+
int n = nums.size();
195+
vector<int> g[n];
196+
bool vis[n];
197+
bool has[n + 2];
198+
memset(vis, false, sizeof(vis));
199+
memset(has, false, sizeof(has));
200+
int idx = -1;
201+
for (int i = 0; i < n; ++i) {
202+
if (i) {
203+
g[parents[i]].push_back(i);
204+
}
205+
if (nums[i] == 1) {
206+
idx = i;
207+
}
208+
}
209+
vector<int> ans(n, 1);
210+
if (idx == -1) {
211+
return ans;
212+
}
213+
function<void(int)> dfs = [&](int i) {
214+
if (vis[i]) {
215+
return;
216+
}
217+
vis[i] = true;
218+
if (nums[i] < n + 2) {
219+
has[nums[i]] = true;
220+
}
221+
for (int j : g[i]) {
222+
dfs(j);
223+
}
224+
};
225+
for (int i = 2; ~idx; idx = parents[idx]) {
226+
dfs(idx);
227+
while (has[i]) {
228+
++i;
229+
}
230+
ans[idx] = i;
231+
}
232+
return ans;
233+
}
234+
};
235+
```
236+
237+
### **Go**
238+
239+
```go
240+
func smallestMissingValueSubtree(parents []int, nums []int) []int {
241+
n := len(nums)
242+
g := make([][]int, n)
243+
vis := make([]bool, n)
244+
has := make([]bool, n+2)
245+
idx := -1
246+
ans := make([]int, n)
247+
for i, p := range parents {
248+
if i > 0 {
249+
g[p] = append(g[p], i)
250+
}
251+
if nums[i] == 1 {
252+
idx = i
253+
}
254+
ans[i] = 1
255+
}
256+
if idx < 0 {
257+
return ans
258+
}
259+
var dfs func(int)
260+
dfs = func(i int) {
261+
if vis[i] {
262+
return
263+
}
264+
vis[i] = true
265+
if nums[i] < len(has) {
266+
has[nums[i]] = true
267+
}
268+
for _, j := range g[i] {
269+
dfs(j)
270+
}
271+
}
272+
for i := 2; idx != -1; idx = parents[idx] {
273+
dfs(idx)
274+
for has[i] {
275+
i++
276+
}
277+
ans[idx] = i
278+
}
279+
return ans
280+
}
281+
```
282+
283+
### **Rust**
284+
285+
```rust
286+
impl Solution {
287+
pub fn smallest_missing_value_subtree(parents: Vec<i32>, nums: Vec<i32>) -> Vec<i32> {
288+
fn dfs(i: usize, vis: &mut Vec<bool>, has: &mut Vec<bool>, g: &Vec<Vec<usize>>, nums: &Vec<i32>) {
289+
if vis[i] {
290+
return;
291+
}
292+
vis[i] = true;
293+
if nums[i] < has.len() as i32 {
294+
has[nums[i] as usize] = true;
295+
}
296+
for &j in &g[i] {
297+
dfs(j, vis, has, g, nums);
298+
}
299+
}
300+
301+
let n = nums.len();
302+
let mut ans = vec![1; n];
303+
let mut g: Vec<Vec<usize>> = vec![vec![]; n];
304+
let mut idx = -1;
305+
for (i, &p) in parents.iter().enumerate() {
306+
if i > 0 {
307+
g[p as usize].push(i);
308+
}
309+
if nums[i] == 1 {
310+
idx = i as i32;
311+
}
312+
}
313+
if idx == -1 {
314+
return ans;
315+
}
316+
let mut vis = vec![false; n];
317+
let mut has = vec![false; (n + 2) as usize];
318+
let mut i = 2;
319+
let mut idx_mut = idx;
320+
while idx_mut != -1 {
321+
dfs(idx_mut as usize, &mut vis, &mut has, &g, &nums);
322+
while has[i] {
323+
i += 1;
324+
}
325+
ans[idx_mut as usize] = i as i32;
326+
idx_mut = parents[idx_mut as usize];
327+
}
328+
ans
329+
}
330+
}
331+
```
87332

333+
### **TypeScript**
334+
335+
```ts
336+
function smallestMissingValueSubtree(parents: number[], nums: number[]): number[] {
337+
const n = nums.length;
338+
const g: number[][] = Array.from({ length: n }, () => []);
339+
const vis: boolean[] = Array(n).fill(false);
340+
const has: boolean[] = Array(n + 2).fill(false);
341+
const ans: number[] = Array(n).fill(1);
342+
let idx = -1;
343+
for (let i = 0; i < n; ++i) {
344+
if (i) {
345+
g[parents[i]].push(i);
346+
}
347+
if (nums[i] === 1) {
348+
idx = i;
349+
}
350+
}
351+
if (idx === -1) {
352+
return ans;
353+
}
354+
const dfs = (i: number): void => {
355+
if (vis[i]) {
356+
return;
357+
}
358+
vis[i] = true;
359+
if (nums[i] < has.length) {
360+
has[nums[i]] = true;
361+
}
362+
for (const j of g[i]) {
363+
dfs(j);
364+
}
365+
};
366+
for (let i = 2; ~idx; idx = parents[idx]) {
367+
dfs(idx);
368+
while (has[i]) {
369+
++i;
370+
}
371+
ans[idx] = i;
372+
}
373+
return ans;
374+
}
88375
```
89376

90377
### **...**

0 commit comments

Comments
 (0)