Skip to content

Commit 777a2a7

Browse files
committed
feat: add solutions to lc problem: No.1733
No.1733.Minimum Number of People to Teach
1 parent 46287a0 commit 777a2a7

File tree

6 files changed

+416
-2
lines changed

6 files changed

+416
-2
lines changed

solution/1700-1799/1733.Minimum Number of People to Teach/README.md

Lines changed: 147 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,22 +57,168 @@
5757

5858
<!-- 这里可写通用的实现逻辑 -->
5959

60+
**方法一:模拟 + 统计**
61+
62+
对于每个好友关系,如果两个人掌握的语言集合不相交,则需要教一门语言,使得两个人可以相互沟通,我们将这些人放入一个哈希集合 $s$ 中。
63+
64+
然后在这个集合 $s$ 中,统计每种语言掌握的人数,获取最大的人数,我们记为 $mx$,那么答案就是 `len(s) - mx`
65+
66+
时间复杂度 $O(m^2\times k)$。其中 $m$ 为语言的数量,而 $k$ 为好友关系的数量。
67+
6068
<!-- tabs:start -->
6169

6270
### **Python3**
6371

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

6674
```python
67-
75+
class Solution:
76+
def minimumTeachings(self, n: int, languages: List[List[int]], friendships: List[List[int]]) -> int:
77+
def check(u, v):
78+
for x in languages[u - 1]:
79+
for y in languages[v - 1]:
80+
if x == y:
81+
return True
82+
return False
83+
84+
s = set()
85+
for u, v in friendships:
86+
if not check(u, v):
87+
s.add(u)
88+
s.add(v)
89+
cnt = Counter()
90+
for u in s:
91+
for l in languages[u - 1]:
92+
cnt[l] += 1
93+
return len(s) - max(cnt.values(), default=0)
6894
```
6995

7096
### **Java**
7197

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

74100
```java
101+
class Solution {
102+
public int minimumTeachings(int n, int[][] languages, int[][] friendships) {
103+
Set<Integer> s = new HashSet<>();
104+
for (var e : friendships) {
105+
int u = e[0], v = e[1];
106+
if (!check(u, v, languages)) {
107+
s.add(u);
108+
s.add(v);
109+
}
110+
}
111+
if (s.isEmpty()) {
112+
return 0;
113+
}
114+
int[] cnt = new int[n + 1];
115+
for (int u : s) {
116+
for (int l : languages[u - 1]) {
117+
++cnt[l];
118+
}
119+
}
120+
int mx = 0;
121+
for (int v : cnt) {
122+
mx = Math.max(mx, v);
123+
}
124+
return s.size() - mx;
125+
}
126+
127+
private boolean check(int u, int v, int[][] languages) {
128+
for (int x : languages[u - 1]) {
129+
for (int y : languages[v - 1]) {
130+
if (x == y) {
131+
return true;
132+
}
133+
}
134+
}
135+
return false;
136+
}
137+
}
138+
```
139+
140+
### **C++**
141+
142+
```cpp
143+
class Solution {
144+
public:
145+
int minimumTeachings(int n, vector<vector<int>>& languages, vector<vector<int>>& friendships) {
146+
unordered_set<int> s;
147+
for (auto& e : friendships) {
148+
int u = e[0], v = e[1];
149+
if (!check(u, v, languages)) {
150+
s.insert(u);
151+
s.insert(v);
152+
}
153+
}
154+
if (s.empty()) {
155+
return 0;
156+
}
157+
vector<int> cnt(n + 1);
158+
for (int u : s) {
159+
for (int& l : languages[u - 1]) {
160+
++cnt[l];
161+
}
162+
}
163+
return s.size() - *max_element(cnt.begin(), cnt.end());
164+
}
165+
166+
bool check(int u, int v, vector<vector<int>>& languages) {
167+
for (int x : languages[u - 1]) {
168+
for (int y : languages[v - 1]) {
169+
if (x == y) {
170+
return true;
171+
}
172+
}
173+
}
174+
return false;
175+
}
176+
};
177+
```
75178

179+
### **Go**
180+
181+
```go
182+
func minimumTeachings(n int, languages [][]int, friendships [][]int) int {
183+
check := func(u, v int) bool {
184+
for _, x := range languages[u-1] {
185+
for _, y := range languages[v-1] {
186+
if x == y {
187+
return true
188+
}
189+
}
190+
}
191+
return false
192+
}
193+
s := map[int]bool{}
194+
for _, e := range friendships {
195+
u, v := e[0], e[1]
196+
if !check(u, v) {
197+
s[u], s[v] = true, true
198+
}
199+
}
200+
if len(s) == 0 {
201+
return 0
202+
}
203+
cnt := make([]int, n+1)
204+
for u := range s {
205+
for _, l := range languages[u-1] {
206+
cnt[l]++
207+
}
208+
}
209+
mx := 0
210+
for _, v := range cnt {
211+
mx = max(mx, v)
212+
}
213+
return len(s) - mx
214+
}
215+
216+
func max(a, b int) int {
217+
if a > b {
218+
return a
219+
}
220+
return b
221+
}
76222
```
77223

78224
### **...**

solution/1700-1799/1733.Minimum Number of People to Teach/README_EN.md

Lines changed: 139 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,151 @@ Note that friendships are not transitive, meaning if <code>x</code> is a friend
5555
### **Python3**
5656

5757
```python
58-
58+
class Solution:
59+
def minimumTeachings(self, n: int, languages: List[List[int]], friendships: List[List[int]]) -> int:
60+
def check(u, v):
61+
for x in languages[u - 1]:
62+
for y in languages[v - 1]:
63+
if x == y:
64+
return True
65+
return False
66+
67+
s = set()
68+
for u, v in friendships:
69+
if not check(u, v):
70+
s.add(u)
71+
s.add(v)
72+
cnt = Counter()
73+
for u in s:
74+
for l in languages[u - 1]:
75+
cnt[l] += 1
76+
return len(s) - max(cnt.values(), default=0)
5977
```
6078

6179
### **Java**
6280

6381
```java
82+
class Solution {
83+
public int minimumTeachings(int n, int[][] languages, int[][] friendships) {
84+
Set<Integer> s = new HashSet<>();
85+
for (var e : friendships) {
86+
int u = e[0], v = e[1];
87+
if (!check(u, v, languages)) {
88+
s.add(u);
89+
s.add(v);
90+
}
91+
}
92+
if (s.isEmpty()) {
93+
return 0;
94+
}
95+
int[] cnt = new int[n + 1];
96+
for (int u : s) {
97+
for (int l : languages[u - 1]) {
98+
++cnt[l];
99+
}
100+
}
101+
int mx = 0;
102+
for (int v : cnt) {
103+
mx = Math.max(mx, v);
104+
}
105+
return s.size() - mx;
106+
}
107+
108+
private boolean check(int u, int v, int[][] languages) {
109+
for (int x : languages[u - 1]) {
110+
for (int y : languages[v - 1]) {
111+
if (x == y) {
112+
return true;
113+
}
114+
}
115+
}
116+
return false;
117+
}
118+
}
119+
```
120+
121+
### **C++**
122+
123+
```cpp
124+
class Solution {
125+
public:
126+
int minimumTeachings(int n, vector<vector<int>>& languages, vector<vector<int>>& friendships) {
127+
unordered_set<int> s;
128+
for (auto& e : friendships) {
129+
int u = e[0], v = e[1];
130+
if (!check(u, v, languages)) {
131+
s.insert(u);
132+
s.insert(v);
133+
}
134+
}
135+
if (s.empty()) {
136+
return 0;
137+
}
138+
vector<int> cnt(n + 1);
139+
for (int u : s) {
140+
for (int& l : languages[u - 1]) {
141+
++cnt[l];
142+
}
143+
}
144+
return s.size() - *max_element(cnt.begin(), cnt.end());
145+
}
146+
147+
bool check(int u, int v, vector<vector<int>>& languages) {
148+
for (int x : languages[u - 1]) {
149+
for (int y : languages[v - 1]) {
150+
if (x == y) {
151+
return true;
152+
}
153+
}
154+
}
155+
return false;
156+
}
157+
};
158+
```
64159

160+
### **Go**
161+
162+
```go
163+
func minimumTeachings(n int, languages [][]int, friendships [][]int) int {
164+
check := func(u, v int) bool {
165+
for _, x := range languages[u-1] {
166+
for _, y := range languages[v-1] {
167+
if x == y {
168+
return true
169+
}
170+
}
171+
}
172+
return false
173+
}
174+
s := map[int]bool{}
175+
for _, e := range friendships {
176+
u, v := e[0], e[1]
177+
if !check(u, v) {
178+
s[u], s[v] = true, true
179+
}
180+
}
181+
if len(s) == 0 {
182+
return 0
183+
}
184+
cnt := make([]int, n+1)
185+
for u := range s {
186+
for _, l := range languages[u-1] {
187+
cnt[l]++
188+
}
189+
}
190+
mx := 0
191+
for _, v := range cnt {
192+
mx = max(mx, v)
193+
}
194+
return len(s) - mx
195+
}
196+
197+
func max(a, b int) int {
198+
if a > b {
199+
return a
200+
}
201+
return b
202+
}
65203
```
66204

67205
### **...**
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
class Solution {
2+
public:
3+
int minimumTeachings(int n, vector<vector<int>>& languages, vector<vector<int>>& friendships) {
4+
unordered_set<int> s;
5+
for (auto& e : friendships) {
6+
int u = e[0], v = e[1];
7+
if (!check(u, v, languages)) {
8+
s.insert(u);
9+
s.insert(v);
10+
}
11+
}
12+
if (s.empty()) {
13+
return 0;
14+
}
15+
vector<int> cnt(n + 1);
16+
for (int u : s) {
17+
for (int& l : languages[u - 1]) {
18+
++cnt[l];
19+
}
20+
}
21+
return s.size() - *max_element(cnt.begin(), cnt.end());
22+
}
23+
24+
bool check(int u, int v, vector<vector<int>>& languages) {
25+
for (int x : languages[u - 1]) {
26+
for (int y : languages[v - 1]) {
27+
if (x == y) {
28+
return true;
29+
}
30+
}
31+
}
32+
return false;
33+
}
34+
};

0 commit comments

Comments
 (0)