Skip to content

Commit dc65ef6

Browse files
committed
feat: add solutions to lc problem: No.1601
No.1601.Maximum Number of Achievable Transfer Request
1 parent c41240e commit dc65ef6

File tree

7 files changed

+203
-138
lines changed

7 files changed

+203
-138
lines changed

solution/1600-1699/1601.Maximum Number of Achievable Transfer Requests/README.md

+72-46
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,12 @@
6565

6666
<!-- 这里可写通用的实现逻辑 -->
6767

68+
**方法一:二进制枚举**
69+
6870
二进制枚举所有方案,找出满足条件的最大请求数方案即可。
6971

72+
时间复杂度 O(m\*2^m),其中 m 表示 requests 的长度。
73+
7074
<!-- tabs:start -->
7175

7276
### **Python3**
@@ -77,19 +81,17 @@
7781
class Solution:
7882
def maximumRequests(self, n: int, requests: List[List[int]]) -> int:
7983
def check(x):
80-
delta = [0] * n
84+
d = [0] * n
8185
for i, (f, t) in enumerate(requests):
8286
if (x >> i) & 1:
83-
delta[f] -= 1
84-
delta[t] += 1
85-
return all(d == 0 for d in delta)
87+
d[f] -= 1
88+
d[t] += 1
89+
return all(v == 0 for v in d)
8690

8791
ans, m = 0, len(requests)
8892
for mask in range(1 << m):
8993
cnt = mask.bit_count()
90-
if cnt <= ans:
91-
continue
92-
if check(mask):
94+
if cnt > ans and check(mask):
9395
ans = cnt
9496
return ans
9597
```
@@ -100,39 +102,29 @@ class Solution:
100102

101103
```java
102104
class Solution {
103-
private int m;
104-
private int n;
105-
private int[][] requests;
106-
107105
public int maximumRequests(int n, int[][] requests) {
108106
int ans = 0;
109-
m = requests.length;
110-
this.n = n;
111-
this.requests = requests;
112-
for (int mask = 0; mask < (1 << m); ++mask) {
107+
for (int mask = 1; mask < 1 << requests.length; ++mask) {
113108
int cnt = Integer.bitCount(mask);
114-
if (cnt <= ans) {
115-
continue;
116-
}
117-
if (check(mask)) {
109+
if (ans < cnt && check(mask, requests)) {
118110
ans = cnt;
119111
}
120112
}
121113
return ans;
122114
}
123115

124-
private boolean check(int x) {
125-
int[] delta = new int[n];
126-
for (int i = 0; i < m; ++i) {
116+
private boolean check(int x, int[][] requests) {
117+
int[] d = new int[21];
118+
for (int i = 0; i < requests.length; ++i) {
127119
if (((x >> i) & 1) == 1) {
128120
int f = requests[i][0];
129121
int t = requests[i][1];
130-
--delta[f];
131-
++delta[t];
122+
--d[f];
123+
++d[t];
132124
}
133125
}
134-
for (int i = 0; i < n; ++i) {
135-
if (delta[i] != 0) {
126+
for (int v : d) {
127+
if (v != 0) {
136128
return false;
137129
}
138130
}
@@ -148,27 +140,26 @@ class Solution {
148140
public:
149141
int maximumRequests(int n, vector<vector<int>>& requests) {
150142
int ans = 0, m = requests.size();
151-
for (int mask = 0; mask < (1 << m); ++mask)
143+
for (int mask = 0; mask < 1 << m; ++mask)
152144
{
153145
int cnt = __builtin_popcount(mask);
154-
if (cnt <= ans) continue;
155-
if (check(mask, m, n, requests)) ans = cnt;
146+
if (ans < cnt && check(mask, requests)) ans = cnt;
156147
}
157148
return ans;
158149
}
159150

160-
bool check(int x, int m, int n, vector<vector<int>>& requests) {
161-
vector<int> delta(n);
162-
for (int i = 0; i < m; ++i)
151+
bool check(int x, vector<vector<int>>& requests) {
152+
vector<int> d(21);
153+
for (int i = 0; i < requests.size(); ++i)
163154
{
164155
if ((x >> i) & 1)
165156
{
166-
--delta[requests[i][0]];
167-
++delta[requests[i][1]];
157+
--d[requests[i][0]];
158+
++d[requests[i][1]];
168159
}
169160
}
170-
for (int i = 0; i < n; ++i)
171-
if (delta[i]) return 0;
161+
for (int& v : d)
162+
if (v) return 0;
172163
return 1;
173164
}
174165
};
@@ -179,35 +170,70 @@ public:
179170
```go
180171
func maximumRequests(n int, requests [][]int) int {
181172
check := func(x int) bool {
182-
delta := make([]int, n)
173+
d := make([]int, n)
183174
for i, r := range requests {
184175
if (x>>i)&1 == 1 {
185-
delta[r[0]]--
186-
delta[r[1]]++
176+
d[r[0]]--
177+
d[r[1]]++
187178
}
188179
}
189-
for _, d := range delta {
190-
if d != 0 {
180+
for _, v := range d {
181+
if v != 0 {
191182
return false
192183
}
193184
}
194185
return true
195186
}
196187

197188
ans, m := 0, len(requests)
198-
for mask := 0; mask < (1 << m); mask++ {
189+
for mask := 0; mask < 1<<m; mask++ {
199190
cnt := bits.OnesCount(uint(mask))
200-
if cnt <= ans {
201-
continue
202-
}
203-
if check(mask) {
191+
if ans < cnt && check(mask) {
204192
ans = cnt
205193
}
206194
}
207195
return ans
208196
}
209197
```
210198

199+
### **JavaScript**
200+
201+
```js
202+
/**
203+
* @param {number} n
204+
* @param {number[][]} requests
205+
* @return {number}
206+
*/
207+
var maximumRequests = function (n, requests) {
208+
function check(x) {
209+
let d = new Array(n).fill(0);
210+
for (let i = 0; i < m; ++i) {
211+
if ((x >> i) & 1) {
212+
const f = requests[i][0];
213+
const t = requests[i][1];
214+
d[f]--;
215+
d[t]++;
216+
}
217+
}
218+
for (const v of d) {
219+
if (v) {
220+
return false;
221+
}
222+
}
223+
return true;
224+
}
225+
let ans = 0;
226+
let m = requests.length;
227+
for (let mask = 1; mask < 1 << m; ++mask) {
228+
let cnt = mask.toString(2).split('0').join('').length;
229+
if (ans < cnt && check(mask)) {
230+
ans = cnt;
231+
}
232+
}
233+
return ans;
234+
};
235+
```
236+
211237
### **...**
212238

213239
```

solution/1600-1699/1601.Maximum Number of Achievable Transfer Requests/README_EN.md

+68-46
Original file line numberDiff line numberDiff line change
@@ -66,19 +66,17 @@ We can achieve all the requests. </pre>
6666
class Solution:
6767
def maximumRequests(self, n: int, requests: List[List[int]]) -> int:
6868
def check(x):
69-
delta = [0] * n
69+
d = [0] * n
7070
for i, (f, t) in enumerate(requests):
7171
if (x >> i) & 1:
72-
delta[f] -= 1
73-
delta[t] += 1
74-
return all(d == 0 for d in delta)
72+
d[f] -= 1
73+
d[t] += 1
74+
return all(v == 0 for v in d)
7575

7676
ans, m = 0, len(requests)
7777
for mask in range(1 << m):
7878
cnt = mask.bit_count()
79-
if cnt <= ans:
80-
continue
81-
if check(mask):
79+
if cnt > ans and check(mask):
8280
ans = cnt
8381
return ans
8482
```
@@ -87,39 +85,29 @@ class Solution:
8785

8886
```java
8987
class Solution {
90-
private int m;
91-
private int n;
92-
private int[][] requests;
93-
9488
public int maximumRequests(int n, int[][] requests) {
9589
int ans = 0;
96-
m = requests.length;
97-
this.n = n;
98-
this.requests = requests;
99-
for (int mask = 0; mask < (1 << m); ++mask) {
90+
for (int mask = 1; mask < 1 << requests.length; ++mask) {
10091
int cnt = Integer.bitCount(mask);
101-
if (cnt <= ans) {
102-
continue;
103-
}
104-
if (check(mask)) {
92+
if (ans < cnt && check(mask, requests)) {
10593
ans = cnt;
10694
}
10795
}
10896
return ans;
10997
}
11098

111-
private boolean check(int x) {
112-
int[] delta = new int[n];
113-
for (int i = 0; i < m; ++i) {
99+
private boolean check(int x, int[][] requests) {
100+
int[] d = new int[21];
101+
for (int i = 0; i < requests.length; ++i) {
114102
if (((x >> i) & 1) == 1) {
115103
int f = requests[i][0];
116104
int t = requests[i][1];
117-
--delta[f];
118-
++delta[t];
105+
--d[f];
106+
++d[t];
119107
}
120108
}
121-
for (int i = 0; i < n; ++i) {
122-
if (delta[i] != 0) {
109+
for (int v : d) {
110+
if (v != 0) {
123111
return false;
124112
}
125113
}
@@ -135,27 +123,26 @@ class Solution {
135123
public:
136124
int maximumRequests(int n, vector<vector<int>>& requests) {
137125
int ans = 0, m = requests.size();
138-
for (int mask = 0; mask < (1 << m); ++mask)
126+
for (int mask = 0; mask < 1 << m; ++mask)
139127
{
140128
int cnt = __builtin_popcount(mask);
141-
if (cnt <= ans) continue;
142-
if (check(mask, m, n, requests)) ans = cnt;
129+
if (ans < cnt && check(mask, requests)) ans = cnt;
143130
}
144131
return ans;
145132
}
146133

147-
bool check(int x, int m, int n, vector<vector<int>>& requests) {
148-
vector<int> delta(n);
149-
for (int i = 0; i < m; ++i)
134+
bool check(int x, vector<vector<int>>& requests) {
135+
vector<int> d(21);
136+
for (int i = 0; i < requests.size(); ++i)
150137
{
151138
if ((x >> i) & 1)
152139
{
153-
--delta[requests[i][0]];
154-
++delta[requests[i][1]];
140+
--d[requests[i][0]];
141+
++d[requests[i][1]];
155142
}
156143
}
157-
for (int i = 0; i < n; ++i)
158-
if (delta[i]) return 0;
144+
for (int& v : d)
145+
if (v) return 0;
159146
return 1;
160147
}
161148
};
@@ -166,35 +153,70 @@ public:
166153
```go
167154
func maximumRequests(n int, requests [][]int) int {
168155
check := func(x int) bool {
169-
delta := make([]int, n)
156+
d := make([]int, n)
170157
for i, r := range requests {
171158
if (x>>i)&1 == 1 {
172-
delta[r[0]]--
173-
delta[r[1]]++
159+
d[r[0]]--
160+
d[r[1]]++
174161
}
175162
}
176-
for _, d := range delta {
177-
if d != 0 {
163+
for _, v := range d {
164+
if v != 0 {
178165
return false
179166
}
180167
}
181168
return true
182169
}
183170

184171
ans, m := 0, len(requests)
185-
for mask := 0; mask < (1 << m); mask++ {
172+
for mask := 0; mask < 1<<m; mask++ {
186173
cnt := bits.OnesCount(uint(mask))
187-
if cnt <= ans {
188-
continue
189-
}
190-
if check(mask) {
174+
if ans < cnt && check(mask) {
191175
ans = cnt
192176
}
193177
}
194178
return ans
195179
}
196180
```
197181

182+
### **JavaScript**
183+
184+
```js
185+
/**
186+
* @param {number} n
187+
* @param {number[][]} requests
188+
* @return {number}
189+
*/
190+
var maximumRequests = function (n, requests) {
191+
function check(x) {
192+
let d = new Array(n).fill(0);
193+
for (let i = 0; i < m; ++i) {
194+
if ((x >> i) & 1) {
195+
const f = requests[i][0];
196+
const t = requests[i][1];
197+
d[f]--;
198+
d[t]++;
199+
}
200+
}
201+
for (const v of d) {
202+
if (v) {
203+
return false;
204+
}
205+
}
206+
return true;
207+
}
208+
let ans = 0;
209+
let m = requests.length;
210+
for (let mask = 1; mask < 1 << m; ++mask) {
211+
let cnt = mask.toString(2).split('0').join('').length;
212+
if (ans < cnt && check(mask)) {
213+
ans = cnt;
214+
}
215+
}
216+
return ans;
217+
};
218+
```
219+
198220
### **...**
199221

200222
```

0 commit comments

Comments
 (0)