Skip to content

Commit d5bd16a

Browse files
committedMay 2, 2023
feat: add solutions to lc problem: No.1601
No.1601.Maximum Number of Achievable Transfer Requests
1 parent 8afb11d commit d5bd16a

File tree

8 files changed

+341
-185
lines changed

8 files changed

+341
-185
lines changed
 

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

+118-63
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,11 @@
6767

6868
**方法一:二进制枚举**
6969

70-
二进制枚举所有方案,找出满足条件的最大请求数方案即可
70+
我们注意到,换楼请求列表长度不超过 $16$,因此我们可以使用二进制枚举的方法枚举所有的换楼请求列表。具体地,我们可以使用一个长度为 $16$ 的二进制数来表示一种换楼请求列表,其中第 $i$ 位为 $1$ 表示第 $i$ 个换楼请求被选中,为 $0$ 表示第 $i$ 个换楼请求不被选中
7171

72-
时间复杂度 O(m\*2^m),其中 m 表示 requests 的长度。
72+
我们在 $[1, 2^{16})$ 的范围内枚举所有的二进制数,对于每个二进制数 $mask$,我们先算出它的二进制表示中有多少个 $1$,记为 $cnt$,如果 $cnt$ 比当前答案 $ans$ 大,那么我们再判断 $mask$ 是否是一个可行的换楼请求列表。如果是,那么我们就用 $cnt$ 更新答案 $ans$。判断 $mask$ 是否是一个可行的换楼请求列表,只需要判断对于每个楼,它的净流入量是否为 $0$ 即可。
73+
74+
时间复杂度 $O(2^m \times m)$,空间复杂度 $O(n)$。其中 $m$ 和 $n$ 分别是换楼请求列表的长度和楼的数量。
7375

7476
<!-- tabs:start -->
7577

@@ -80,18 +82,18 @@
8082
```python
8183
class Solution:
8284
def maximumRequests(self, n: int, requests: List[List[int]]) -> int:
83-
def check(x):
84-
d = [0] * n
85+
def check(mask: int) -> bool:
86+
cnt = [0] * n
8587
for i, (f, t) in enumerate(requests):
86-
if (x >> i) & 1:
87-
d[f] -= 1
88-
d[t] += 1
89-
return all(v == 0 for v in d)
88+
if mask >> i & 1:
89+
cnt[f] -= 1
90+
cnt[t] += 1
91+
return all(v == 0 for v in cnt)
9092

91-
ans, m = 0, len(requests)
92-
for mask in range(1 << m):
93+
ans = 0
94+
for mask in range(1 << len(requests)):
9395
cnt = mask.bit_count()
94-
if cnt > ans and check(mask):
96+
if ans < cnt and check(mask):
9597
ans = cnt
9698
return ans
9799
```
@@ -102,28 +104,34 @@ class Solution:
102104

103105
```java
104106
class Solution {
107+
private int m;
108+
private int n;
109+
private int[][] requests;
110+
105111
public int maximumRequests(int n, int[][] requests) {
112+
m = requests.length;
113+
this.n = n;
114+
this.requests = requests;
106115
int ans = 0;
107-
for (int mask = 1; mask < 1 << requests.length; ++mask) {
116+
for (int mask = 0; mask < 1 << m; ++mask) {
108117
int cnt = Integer.bitCount(mask);
109-
if (ans < cnt && check(mask, requests)) {
118+
if (ans < cnt && check(mask)) {
110119
ans = cnt;
111120
}
112121
}
113122
return ans;
114123
}
115124

116-
private boolean check(int x, int[][] requests) {
117-
int[] d = new int[21];
118-
for (int i = 0; i < requests.length; ++i) {
119-
if (((x >> i) & 1) == 1) {
120-
int f = requests[i][0];
121-
int t = requests[i][1];
122-
--d[f];
123-
++d[t];
125+
private boolean check(int mask) {
126+
int[] cnt = new int[n];
127+
for (int i = 0; i < m; ++i) {
128+
if ((mask >> i & 1) == 1) {
129+
int f = requests[i][0], t = requests[i][1];
130+
--cnt[f];
131+
++cnt[t];
124132
}
125133
}
126-
for (int v : d) {
134+
for (int v : cnt) {
127135
if (v != 0) {
128136
return false;
129137
}
@@ -139,57 +147,100 @@ class Solution {
139147
class Solution {
140148
public:
141149
int maximumRequests(int n, vector<vector<int>>& requests) {
142-
int ans = 0, m = requests.size();
150+
int m = requests.size();
151+
int ans = 0;
152+
auto check = [&](int mask) -> bool {
153+
int cnt[n];
154+
memset(cnt, 0, sizeof(cnt));
155+
for (int i = 0; i < m; ++i) {
156+
if (mask >> i & 1) {
157+
int f = requests[i][0], t = requests[i][1];
158+
--cnt[f];
159+
++cnt[t];
160+
}
161+
}
162+
for (int v : cnt) {
163+
if (v) {
164+
return false;
165+
}
166+
}
167+
return true;
168+
};
143169
for (int mask = 0; mask < 1 << m; ++mask) {
144170
int cnt = __builtin_popcount(mask);
145-
if (ans < cnt && check(mask, requests)) ans = cnt;
146-
}
147-
return ans;
148-
}
149-
150-
bool check(int x, vector<vector<int>>& requests) {
151-
vector<int> d(21);
152-
for (int i = 0; i < requests.size(); ++i) {
153-
if ((x >> i) & 1) {
154-
--d[requests[i][0]];
155-
++d[requests[i][1]];
171+
if (ans < cnt && check(mask)) {
172+
ans = cnt;
156173
}
157174
}
158-
for (int& v : d)
159-
if (v) return 0;
160-
return 1;
175+
return ans;
161176
}
162177
};
163178
```
164179
165180
### **Go**
166181
167182
```go
168-
func maximumRequests(n int, requests [][]int) int {
169-
check := func(x int) bool {
170-
d := make([]int, n)
183+
func maximumRequests(n int, requests [][]int) (ans int) {
184+
m := len(requests)
185+
check := func(mask int) bool {
186+
cnt := make([]int, n)
171187
for i, r := range requests {
172-
if (x>>i)&1 == 1 {
173-
d[r[0]]--
174-
d[r[1]]++
188+
if mask>>i&1 == 1 {
189+
f, t := r[0], r[1]
190+
cnt[f]--
191+
cnt[t]++
175192
}
176193
}
177-
for _, v := range d {
194+
for _, v := range cnt {
178195
if v != 0 {
179196
return false
180197
}
181198
}
182199
return true
183200
}
184-
185-
ans, m := 0, len(requests)
186201
for mask := 0; mask < 1<<m; mask++ {
187202
cnt := bits.OnesCount(uint(mask))
188203
if ans < cnt && check(mask) {
189204
ans = cnt
190205
}
191206
}
192-
return ans
207+
return
208+
}
209+
```
210+
211+
### **TypeScript**
212+
213+
```ts
214+
function maximumRequests(n: number, requests: number[][]): number {
215+
const m = requests.length;
216+
let ans = 0;
217+
const check = (mask: number): boolean => {
218+
const cnt = new Array(n).fill(0);
219+
for (let i = 0; i < m; ++i) {
220+
if ((mask >> i) & 1) {
221+
const [f, t] = requests[i];
222+
--cnt[f];
223+
++cnt[t];
224+
}
225+
}
226+
return cnt.every(v => v === 0);
227+
};
228+
for (let mask = 0; mask < 1 << m; ++mask) {
229+
const cnt = bitCount(mask);
230+
if (ans < cnt && check(mask)) {
231+
ans = cnt;
232+
}
233+
}
234+
return ans;
235+
}
236+
237+
function bitCount(i: number): number {
238+
i = i - ((i >>> 1) & 0x55555555);
239+
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
240+
i = (i + (i >>> 4)) & 0x0f0f0f0f;
241+
i = i + (i >>> 8);
242+
i = i + (i >>> 16);
243+
return i & 0x3f;
193244
}
194245
```
195246

@@ -202,32 +253,36 @@ func maximumRequests(n int, requests [][]int) int {
202253
* @return {number}
203254
*/
204255
var maximumRequests = function (n, requests) {
205-
function check(x) {
206-
let d = new Array(n).fill(0);
256+
const m = requests.length;
257+
let ans = 0;
258+
const check = mask => {
259+
const cnt = new Array(n).fill(0);
207260
for (let i = 0; i < m; ++i) {
208-
if ((x >> i) & 1) {
261+
if ((mask >> i) & 1) {
209262
const [f, t] = requests[i];
210-
d[f]--;
211-
d[t]++;
263+
--cnt[f];
264+
++cnt[t];
212265
}
213266
}
214-
for (const v of d) {
215-
if (v) {
216-
return false;
217-
}
218-
}
219-
return true;
220-
}
221-
let ans = 0;
222-
let m = requests.length;
223-
for (let mask = 1; mask < 1 << m; ++mask) {
224-
let cnt = mask.toString(2).split('0').join('').length;
267+
return cnt.every(v => v === 0);
268+
};
269+
for (let mask = 0; mask < 1 << m; ++mask) {
270+
const cnt = bitCount(mask);
225271
if (ans < cnt && check(mask)) {
226272
ans = cnt;
227273
}
228274
}
229275
return ans;
230276
};
277+
278+
function bitCount(i) {
279+
i = i - ((i >>> 1) & 0x55555555);
280+
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
281+
i = (i + (i >>> 4)) & 0x0f0f0f0f;
282+
i = i + (i >>> 8);
283+
i = i + (i >>> 16);
284+
return i & 0x3f;
285+
}
231286
```
232287

233288
### **...**

0 commit comments

Comments
 (0)