Skip to content

Commit 2767cef

Browse files
committed
feat: add solutions to lc problem: No.1820
No.1820.Maximum Number of Accepted Invitations
1 parent 5c9ded2 commit 2767cef

File tree

6 files changed

+356
-2
lines changed

6 files changed

+356
-2
lines changed

solution/1800-1899/1820.Maximum Number of Accepted Invitations/README.md

Lines changed: 127 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,22 +53,148 @@
5353

5454
<!-- 这里可写通用的实现逻辑 -->
5555

56+
**方法一:匈牙利算法**
57+
58+
本题属于二分图最大匹配问题,适合用匈牙利算法来求解。
59+
60+
匈牙利算法的核心思想是,不断地从未匹配的点出发,寻找增广路径,直到没有增广路径为止,就得到了最大匹配。
61+
62+
时间复杂度 $O(m\times n)$。
63+
5664
<!-- tabs:start -->
5765

5866
### **Python3**
5967

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

6270
```python
63-
71+
class Solution:
72+
def maximumInvitations(self, grid: List[List[int]]) -> int:
73+
def find(i):
74+
for j, v in enumerate(grid[i]):
75+
if v and j not in vis:
76+
vis.add(j)
77+
if match[j] == -1 or find(match[j]):
78+
match[j] = i
79+
return True
80+
return False
81+
82+
m, n = len(grid), len(grid[0])
83+
match = [-1] * n
84+
ans = 0
85+
for i in range(m):
86+
vis = set()
87+
ans += find(i)
88+
return ans
6489
```
6590

6691
### **Java**
6792

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

7095
```java
96+
class Solution {
97+
private int[][] grid;
98+
private boolean[] vis;
99+
private int[] match;
100+
private int n;
101+
102+
public int maximumInvitations(int[][] grid) {
103+
int m = grid.length;
104+
n = grid[0].length;
105+
this.grid = grid;
106+
vis = new boolean[n];
107+
match = new int[n];
108+
Arrays.fill(match, -1);
109+
int ans = 0;
110+
for (int i = 0; i < m; ++i) {
111+
Arrays.fill(vis, false);
112+
if (find(i)) {
113+
++ans;
114+
}
115+
}
116+
return ans;
117+
}
118+
119+
private boolean find(int i) {
120+
for (int j = 0; j < n; ++j) {
121+
if (grid[i][j] == 1 && !vis[j]) {
122+
vis[j] = true;
123+
if (match[j] == -1 || find(match[j])) {
124+
match[j] = i;
125+
return true;
126+
}
127+
}
128+
}
129+
return false;
130+
}
131+
}
132+
```
133+
134+
### **C++**
135+
136+
```cpp
137+
class Solution {
138+
public:
139+
int maximumInvitations(vector<vector<int>>& grid) {
140+
int m = grid.size(), n = grid[0].size();
141+
bool vis[210];
142+
int match[210];
143+
memset(match, -1, sizeof match);
144+
int ans = 0;
145+
function<bool(int)> find = [&](int i) -> bool {
146+
for (int j = 0; j < n; ++j) {
147+
if (grid[i][j] && !vis[j]) {
148+
vis[j] = true;
149+
if (match[j] == -1 || find(match[j])) {
150+
match[j] = i;
151+
return true;
152+
}
153+
}
154+
}
155+
return false;
156+
};
157+
for (int i = 0; i < m; ++i) {
158+
memset(vis, 0, sizeof vis);
159+
ans += find(i);
160+
}
161+
return ans;
162+
}
163+
};
164+
```
71165
166+
### **Go**
167+
168+
```go
169+
func maximumInvitations(grid [][]int) int {
170+
m, n := len(grid), len(grid[0])
171+
var vis map[int]bool
172+
match := make([]int, n)
173+
for i := range match {
174+
match[i] = -1
175+
}
176+
var find func(i int) bool
177+
find = func(i int) bool {
178+
for j, v := range grid[i] {
179+
if v == 1 && !vis[j] {
180+
vis[j] = true
181+
if match[j] == -1 || find(match[j]) {
182+
match[j] = i
183+
return true
184+
}
185+
}
186+
}
187+
return false
188+
}
189+
ans := 0
190+
for i := 0; i < m; i++ {
191+
vis = map[int]bool{}
192+
if find(i) {
193+
ans++
194+
}
195+
}
196+
return ans
197+
}
72198
```
73199

74200
### **...**

solution/1800-1899/1820.Maximum Number of Accepted Invitations/README_EN.md

Lines changed: 119 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,131 @@ Explanation:</strong> The invitations are sent as follows:
5454
### **Python3**
5555

5656
```python
57-
57+
class Solution:
58+
def maximumInvitations(self, grid: List[List[int]]) -> int:
59+
def find(i):
60+
for j, v in enumerate(grid[i]):
61+
if v and j not in vis:
62+
vis.add(j)
63+
if match[j] == -1 or find(match[j]):
64+
match[j] = i
65+
return True
66+
return False
67+
68+
m, n = len(grid), len(grid[0])
69+
match = [-1] * n
70+
ans = 0
71+
for i in range(m):
72+
vis = set()
73+
ans += find(i)
74+
return ans
5875
```
5976

6077
### **Java**
6178

6279
```java
80+
class Solution {
81+
private int[][] grid;
82+
private boolean[] vis;
83+
private int[] match;
84+
private int n;
85+
86+
public int maximumInvitations(int[][] grid) {
87+
int m = grid.length;
88+
n = grid[0].length;
89+
this.grid = grid;
90+
vis = new boolean[n];
91+
match = new int[n];
92+
Arrays.fill(match, -1);
93+
int ans = 0;
94+
for (int i = 0; i < m; ++i) {
95+
Arrays.fill(vis, false);
96+
if (find(i)) {
97+
++ans;
98+
}
99+
}
100+
return ans;
101+
}
102+
103+
private boolean find(int i) {
104+
for (int j = 0; j < n; ++j) {
105+
if (grid[i][j] == 1 && !vis[j]) {
106+
vis[j] = true;
107+
if (match[j] == -1 || find(match[j])) {
108+
match[j] = i;
109+
return true;
110+
}
111+
}
112+
}
113+
return false;
114+
}
115+
}
116+
```
117+
118+
### **C++**
119+
120+
```cpp
121+
class Solution {
122+
public:
123+
int maximumInvitations(vector<vector<int>>& grid) {
124+
int m = grid.size(), n = grid[0].size();
125+
bool vis[210];
126+
int match[210];
127+
memset(match, -1, sizeof match);
128+
int ans = 0;
129+
function<bool(int)> find = [&](int i) -> bool {
130+
for (int j = 0; j < n; ++j) {
131+
if (grid[i][j] && !vis[j]) {
132+
vis[j] = true;
133+
if (match[j] == -1 || find(match[j])) {
134+
match[j] = i;
135+
return true;
136+
}
137+
}
138+
}
139+
return false;
140+
};
141+
for (int i = 0; i < m; ++i) {
142+
memset(vis, 0, sizeof vis);
143+
ans += find(i);
144+
}
145+
return ans;
146+
}
147+
};
148+
```
63149
150+
### **Go**
151+
152+
```go
153+
func maximumInvitations(grid [][]int) int {
154+
m, n := len(grid), len(grid[0])
155+
var vis map[int]bool
156+
match := make([]int, n)
157+
for i := range match {
158+
match[i] = -1
159+
}
160+
var find func(i int) bool
161+
find = func(i int) bool {
162+
for j, v := range grid[i] {
163+
if v == 1 && !vis[j] {
164+
vis[j] = true
165+
if match[j] == -1 || find(match[j]) {
166+
match[j] = i
167+
return true
168+
}
169+
}
170+
}
171+
return false
172+
}
173+
ans := 0
174+
for i := 0; i < m; i++ {
175+
vis = map[int]bool{}
176+
if find(i) {
177+
ans++
178+
}
179+
}
180+
return ans
181+
}
64182
```
65183

66184
### **...**
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution {
2+
public:
3+
int maximumInvitations(vector<vector<int>>& grid) {
4+
int m = grid.size(), n = grid[0].size();
5+
bool vis[210];
6+
int match[210];
7+
memset(match, -1, sizeof match);
8+
int ans = 0;
9+
function<bool(int)> find = [&](int i) -> bool {
10+
for (int j = 0; j < n; ++j) {
11+
if (grid[i][j] && !vis[j]) {
12+
vis[j] = true;
13+
if (match[j] == -1 || find(match[j])) {
14+
match[j] = i;
15+
return true;
16+
}
17+
}
18+
}
19+
return false;
20+
};
21+
for (int i = 0; i < m; ++i) {
22+
memset(vis, 0, sizeof vis);
23+
ans += find(i);
24+
}
25+
return ans;
26+
}
27+
};
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
func maximumInvitations(grid [][]int) int {
2+
m, n := len(grid), len(grid[0])
3+
var vis map[int]bool
4+
match := make([]int, n)
5+
for i := range match {
6+
match[i] = -1
7+
}
8+
var find func(i int) bool
9+
find = func(i int) bool {
10+
for j, v := range grid[i] {
11+
if v == 1 && !vis[j] {
12+
vis[j] = true
13+
if match[j] == -1 || find(match[j]) {
14+
match[j] = i
15+
return true
16+
}
17+
}
18+
}
19+
return false
20+
}
21+
ans := 0
22+
for i := 0; i < m; i++ {
23+
vis = map[int]bool{}
24+
if find(i) {
25+
ans++
26+
}
27+
}
28+
return ans
29+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
class Solution {
2+
private int[][] grid;
3+
private boolean[] vis;
4+
private int[] match;
5+
private int n;
6+
7+
public int maximumInvitations(int[][] grid) {
8+
int m = grid.length;
9+
n = grid[0].length;
10+
this.grid = grid;
11+
vis = new boolean[n];
12+
match = new int[n];
13+
Arrays.fill(match, -1);
14+
int ans = 0;
15+
for (int i = 0; i < m; ++i) {
16+
Arrays.fill(vis, false);
17+
if (find(i)) {
18+
++ans;
19+
}
20+
}
21+
return ans;
22+
}
23+
24+
private boolean find(int i) {
25+
for (int j = 0; j < n; ++j) {
26+
if (grid[i][j] == 1 && !vis[j]) {
27+
vis[j] = true;
28+
if (match[j] == -1 || find(match[j])) {
29+
match[j] = i;
30+
return true;
31+
}
32+
}
33+
}
34+
return false;
35+
}
36+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution:
2+
def maximumInvitations(self, grid: List[List[int]]) -> int:
3+
def find(i):
4+
for j, v in enumerate(grid[i]):
5+
if v and j not in vis:
6+
vis.add(j)
7+
if match[j] == -1 or find(match[j]):
8+
match[j] = i
9+
return True
10+
return False
11+
12+
m, n = len(grid), len(grid[0])
13+
match = [-1] * n
14+
ans = 0
15+
for i in range(m):
16+
vis = set()
17+
ans += find(i)
18+
return ans

0 commit comments

Comments
 (0)