Skip to content

Commit c85aa2d

Browse files
authored
feat: add solutions to lc problem: No.1557 (#1059)
No.1557.Minimum Number of Vertices to Reach All Nodes
1 parent 73400d1 commit c85aa2d

File tree

7 files changed

+89
-76
lines changed

7 files changed

+89
-76
lines changed

solution/1500-1599/1557.Minimum Number of Vertices to Reach All Nodes/README.md

Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,11 @@
4747

4848
<!-- 这里可写通用的实现逻辑 -->
4949

50-
找出所有入度为 0 的点即可。
50+
**方法一:统计入度为 0 的点**
51+
52+
我们注意到,所有入度为 $0$ 的点都一定属于最小点集,因为它们没有任何入边。而由于题目给定的是一张有向无环图,因此所有入度不为 $0$ 的点一定存在一条入边,也即一定能从某个入度为 $0$ 的点出发到达。因此我们只需要找到所有入度为 $0$ 的点即可。
53+
54+
时间复杂度 $O(n + m)$,空间复杂度 $O(n)$。其中 $n$ 和 $m$ 分别是节点数和边数。
5155

5256
<!-- tabs:start -->
5357

@@ -58,8 +62,8 @@
5862
```python
5963
class Solution:
6064
def findSmallestSetOfVertices(self, n: int, edges: List[List[int]]) -> List[int]:
61-
s = {to for _, to in edges}
62-
return [i for i in range(n) if i not in s]
65+
cnt = Counter(t for _, t in edges)
66+
return [i for i in range(n) if cnt[i] == 0]
6367
```
6468

6569
### **Java**
@@ -69,13 +73,13 @@ class Solution:
6973
```java
7074
class Solution {
7175
public List<Integer> findSmallestSetOfVertices(int n, List<List<Integer>> edges) {
72-
Set<Integer> s = new HashSet<>();
73-
for (List<Integer> e : edges) {
74-
s.add(e.get(1));
76+
var cnt = new int[n];
77+
for (var e : edges) {
78+
++cnt[e.get(1)];
7579
}
7680
List<Integer> ans = new ArrayList<>();
7781
for (int i = 0; i < n; ++i) {
78-
if (!s.contains(i)) {
82+
if (cnt[i] == 0) {
7983
ans.add(i);
8084
}
8185
}
@@ -90,11 +94,15 @@ class Solution {
9094
class Solution {
9195
public:
9296
vector<int> findSmallestSetOfVertices(int n, vector<vector<int>>& edges) {
93-
unordered_set<int> s;
94-
for (auto& e : edges) s.insert(e[1]);
97+
vector<int> cnt(n);
98+
for (auto& e : edges) {
99+
++cnt[e[1]];
100+
}
95101
vector<int> ans;
96102
for (int i = 0; i < n; ++i) {
97-
if (!s.count(i)) ans.push_back(i);
103+
if (cnt[i] == 0) {
104+
ans.push_back(i);
105+
}
98106
}
99107
return ans;
100108
}
@@ -104,36 +112,35 @@ public:
104112
### **Go**
105113
106114
```go
107-
func findSmallestSetOfVertices(n int, edges [][]int) []int {
108-
s := make(map[int]bool)
115+
func findSmallestSetOfVertices(n int, edges [][]int) (ans []int) {
116+
cnt := make([]int, n)
109117
for _, e := range edges {
110-
s[e[1]] = true
118+
cnt[e[1]]++
111119
}
112-
var ans []int
113-
for i := 0; i < n; i++ {
114-
if !s[i] {
120+
for i, c := range cnt {
121+
if c == 0 {
115122
ans = append(ans, i)
116123
}
117124
}
118-
return ans
125+
return
119126
}
120127
```
121128

122129
### **TypeScript**
123130

124131
```ts
125132
function findSmallestSetOfVertices(n: number, edges: number[][]): number[] {
126-
const arr = new Array(n).fill(true);
127-
for (const [_, i] of edges) {
128-
arr[i] = false;
133+
const cnt: number[] = new Array(n).fill(0);
134+
for (const [_, t] of edges) {
135+
cnt[t]++;
129136
}
130-
const res = [];
131-
arr.forEach((v, i) => {
132-
if (v) {
133-
res.push(i);
137+
const ans: number[] = [];
138+
for (let i = 0; i < n; ++i) {
139+
if (cnt[i] === 0) {
140+
ans.push(i);
134141
}
135-
});
136-
return res;
142+
}
143+
return ans;
137144
}
138145
```
139146

solution/1500-1599/1557.Minimum Number of Vertices to Reach All Nodes/README_EN.md

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -50,22 +50,22 @@
5050
```python
5151
class Solution:
5252
def findSmallestSetOfVertices(self, n: int, edges: List[List[int]]) -> List[int]:
53-
s = {to for _, to in edges}
54-
return [i for i in range(n) if i not in s]
53+
cnt = Counter(t for _, t in edges)
54+
return [i for i in range(n) if cnt[i] == 0]
5555
```
5656

5757
### **Java**
5858

5959
```java
6060
class Solution {
6161
public List<Integer> findSmallestSetOfVertices(int n, List<List<Integer>> edges) {
62-
Set<Integer> s = new HashSet<>();
63-
for (List<Integer> e : edges) {
64-
s.add(e.get(1));
62+
var cnt = new int[n];
63+
for (var e : edges) {
64+
++cnt[e.get(1)];
6565
}
6666
List<Integer> ans = new ArrayList<>();
6767
for (int i = 0; i < n; ++i) {
68-
if (!s.contains(i)) {
68+
if (cnt[i] == 0) {
6969
ans.add(i);
7070
}
7171
}
@@ -80,11 +80,15 @@ class Solution {
8080
class Solution {
8181
public:
8282
vector<int> findSmallestSetOfVertices(int n, vector<vector<int>>& edges) {
83-
unordered_set<int> s;
84-
for (auto& e : edges) s.insert(e[1]);
83+
vector<int> cnt(n);
84+
for (auto& e : edges) {
85+
++cnt[e[1]];
86+
}
8587
vector<int> ans;
8688
for (int i = 0; i < n; ++i) {
87-
if (!s.count(i)) ans.push_back(i);
89+
if (cnt[i] == 0) {
90+
ans.push_back(i);
91+
}
8892
}
8993
return ans;
9094
}
@@ -94,36 +98,35 @@ public:
9498
### **Go**
9599
96100
```go
97-
func findSmallestSetOfVertices(n int, edges [][]int) []int {
98-
s := make(map[int]bool)
101+
func findSmallestSetOfVertices(n int, edges [][]int) (ans []int) {
102+
cnt := make([]int, n)
99103
for _, e := range edges {
100-
s[e[1]] = true
104+
cnt[e[1]]++
101105
}
102-
var ans []int
103-
for i := 0; i < n; i++ {
104-
if !s[i] {
106+
for i, c := range cnt {
107+
if c == 0 {
105108
ans = append(ans, i)
106109
}
107110
}
108-
return ans
111+
return
109112
}
110113
```
111114

112115
### **TypeScript**
113116

114117
```ts
115118
function findSmallestSetOfVertices(n: number, edges: number[][]): number[] {
116-
const arr = new Array(n).fill(true);
117-
for (const [_, i] of edges) {
118-
arr[i] = false;
119+
const cnt: number[] = new Array(n).fill(0);
120+
for (const [_, t] of edges) {
121+
cnt[t]++;
119122
}
120-
const res = [];
121-
arr.forEach((v, i) => {
122-
if (v) {
123-
res.push(i);
123+
const ans: number[] = [];
124+
for (let i = 0; i < n; ++i) {
125+
if (cnt[i] === 0) {
126+
ans.push(i);
124127
}
125-
});
126-
return res;
128+
}
129+
return ans;
127130
}
128131
```
129132

solution/1500-1599/1557.Minimum Number of Vertices to Reach All Nodes/Solution.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
class Solution {
22
public:
33
vector<int> findSmallestSetOfVertices(int n, vector<vector<int>>& edges) {
4-
unordered_set<int> s;
5-
for (auto& e : edges) s.insert(e[1]);
4+
vector<int> cnt(n);
5+
for (auto& e : edges) {
6+
++cnt[e[1]];
7+
}
68
vector<int> ans;
79
for (int i = 0; i < n; ++i) {
8-
if (!s.count(i)) ans.push_back(i);
10+
if (cnt[i] == 0) {
11+
ans.push_back(i);
12+
}
913
}
1014
return ans;
1115
}
Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
func findSmallestSetOfVertices(n int, edges [][]int) []int {
2-
s := make(map[int]bool)
1+
func findSmallestSetOfVertices(n int, edges [][]int) (ans []int) {
2+
cnt := make([]int, n)
33
for _, e := range edges {
4-
s[e[1]] = true
4+
cnt[e[1]]++
55
}
6-
var ans []int
7-
for i := 0; i < n; i++ {
8-
if !s[i] {
6+
for i, c := range cnt {
7+
if c == 0 {
98
ans = append(ans, i)
109
}
1110
}
12-
return ans
11+
return
1312
}

solution/1500-1599/1557.Minimum Number of Vertices to Reach All Nodes/Solution.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
class Solution {
22
public List<Integer> findSmallestSetOfVertices(int n, List<List<Integer>> edges) {
3-
Set<Integer> s = new HashSet<>();
4-
for (List<Integer> e : edges) {
5-
s.add(e.get(1));
3+
var cnt = new int[n];
4+
for (var e : edges) {
5+
++cnt[e.get(1)];
66
}
77
List<Integer> ans = new ArrayList<>();
88
for (int i = 0; i < n; ++i) {
9-
if (!s.contains(i)) {
9+
if (cnt[i] == 0) {
1010
ans.add(i);
1111
}
1212
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
class Solution:
22
def findSmallestSetOfVertices(self, n: int, edges: List[List[int]]) -> List[int]:
3-
s = {to for _, to in edges}
4-
return [i for i in range(n) if i not in s]
3+
cnt = Counter(t for _, t in edges)
4+
return [i for i in range(n) if cnt[i] == 0]
Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
function findSmallestSetOfVertices(n: number, edges: number[][]): number[] {
2-
const arr = new Array(n).fill(true);
3-
for (const [_, i] of edges) {
4-
arr[i] = false;
2+
const cnt: number[] = new Array(n).fill(0);
3+
for (const [_, t] of edges) {
4+
cnt[t]++;
55
}
6-
const res = [];
7-
arr.forEach((v, i) => {
8-
if (v) {
9-
res.push(i);
6+
const ans: number[] = [];
7+
for (let i = 0; i < n; ++i) {
8+
if (cnt[i] === 0) {
9+
ans.push(i);
1010
}
11-
});
12-
return res;
11+
}
12+
return ans;
1313
}

0 commit comments

Comments
 (0)