67
67
68
68
** 方法一:二进制枚举**
69
69
70
- 二进制枚举所有方案,找出满足条件的最大请求数方案即可 。
70
+ 我们注意到,换楼请求列表长度不超过 $16$,因此我们可以使用二进制枚举的方法枚举所有的换楼请求列表。具体地,我们可以使用一个长度为 $16$ 的二进制数来表示一种换楼请求列表,其中第 $i$ 位为 $1$ 表示第 $i$ 个换楼请求被选中,为 $0$ 表示第 $i$ 个换楼请求不被选中 。
71
71
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$ 分别是换楼请求列表的长度和楼的数量。
73
75
74
76
<!-- tabs:start -->
75
77
80
82
``` python
81
83
class Solution :
82
84
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
85
87
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 )
90
92
91
- ans, m = 0 , len (requests)
92
- for mask in range (1 << m ):
93
+ ans = 0
94
+ for mask in range (1 << len (requests) ):
93
95
cnt = mask.bit_count()
94
- if cnt > ans and check(mask):
96
+ if ans < cnt and check(mask):
95
97
ans = cnt
96
98
return ans
97
99
```
@@ -102,28 +104,34 @@ class Solution:
102
104
103
105
``` java
104
106
class Solution {
107
+ private int m;
108
+ private int n;
109
+ private int [][] requests;
110
+
105
111
public int maximumRequests (int n , int [][] requests ) {
112
+ m = requests. length;
113
+ this . n = n;
114
+ this . requests = requests;
106
115
int ans = 0 ;
107
- for (int mask = 1 ; mask < 1 << requests . length ; ++ mask) {
116
+ for (int mask = 0 ; mask < 1 << m ; ++ mask) {
108
117
int cnt = Integer . bitCount(mask);
109
- if (ans < cnt && check(mask, requests )) {
118
+ if (ans < cnt && check(mask)) {
110
119
ans = cnt;
111
120
}
112
121
}
113
122
return ans;
114
123
}
115
124
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];
124
132
}
125
133
}
126
- for (int v : d ) {
134
+ for (int v : cnt ) {
127
135
if (v != 0 ) {
128
136
return false ;
129
137
}
@@ -139,57 +147,100 @@ class Solution {
139
147
class Solution {
140
148
public:
141
149
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
+ };
143
169
for (int mask = 0; mask < 1 << m; ++mask) {
144
170
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;
156
173
}
157
174
}
158
- for (int & v : d)
159
- if (v) return 0 ;
160
- return 1 ;
175
+ return ans;
161
176
}
162
177
};
163
178
```
164
179
165
180
### **Go**
166
181
167
182
```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)
171
187
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]++
175
192
}
176
193
}
177
- for _ , v := range d {
194
+ for _, v := range cnt {
178
195
if v != 0 {
179
196
return false
180
197
}
181
198
}
182
199
return true
183
200
}
184
-
185
- ans , m := 0 , len (requests)
186
201
for mask := 0; mask < 1<<m; mask++ {
187
202
cnt := bits.OnesCount(uint(mask))
188
203
if ans < cnt && check(mask) {
189
204
ans = cnt
190
205
}
191
206
}
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 ;
193
244
}
194
245
```
195
246
@@ -202,32 +253,36 @@ func maximumRequests(n int, requests [][]int) int {
202
253
* @return {number}
203
254
*/
204
255
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 );
207
260
for (let i = 0 ; i < m; ++ i) {
208
- if ((x >> i) & 1 ) {
261
+ if ((mask >> i) & 1 ) {
209
262
const [f , t ] = requests[i];
210
- d [f]-- ;
211
- d [t]++ ;
263
+ -- cnt [f];
264
+ ++ cnt [t];
212
265
}
213
266
}
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);
225
271
if (ans < cnt && check (mask)) {
226
272
ans = cnt;
227
273
}
228
274
}
229
275
return ans;
230
276
};
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
+ }
231
286
```
232
287
233
288
### ** ...**
0 commit comments