Skip to content

Commit f21c6da

Browse files
authored
feat: add solutions to lc problems: No.3129,3130 (#3352)
* No.3129.Find All Possible Stable Binary Arrays I * No.3130.Find All Possible Stable Binary Arrays II
1 parent 5ad2330 commit f21c6da

File tree

15 files changed

+496
-345
lines changed

15 files changed

+496
-345
lines changed

solution/3100-3199/3129.Find All Possible Stable Binary Arrays I/README.md

+100-53
Original file line numberDiff line numberDiff line change
@@ -176,41 +176,34 @@ class Solution {
176176
#### C++
177177

178178
```cpp
179-
using ll = long long;
180-
181179
class Solution {
182180
public:
183181
int numberOfStableArrays(int zero, int one, int limit) {
184-
this->limit = limit;
185-
f = vector<vector<array<ll, 2>>>(zero + 1, vector<array<ll, 2>>(one + 1, {-1, -1}));
186-
return (dfs(zero, one, 0) + dfs(zero, one, 1)) % mod;
187-
}
188-
189-
private:
190-
const int mod = 1e9 + 7;
191-
int limit;
192-
vector<vector<array<ll, 2>>> f;
193-
194-
ll dfs(int i, int j, int k) {
195-
if (i < 0 || j < 0) {
196-
return 0;
197-
}
198-
if (i == 0) {
199-
return k == 1 && j <= limit;
200-
}
201-
if (j == 0) {
202-
return k == 0 && i <= limit;
203-
}
204-
ll& res = f[i][j][k];
205-
if (res != -1) {
182+
const int mod = 1e9 + 7;
183+
using ll = long long;
184+
vector<vector<array<ll, 2>>> f = vector<vector<array<ll, 2>>>(zero + 1, vector<array<ll, 2>>(one + 1, {-1, -1}));
185+
auto dfs = [&](auto&& dfs, int i, int j, int k) -> ll {
186+
if (i < 0 || j < 0) {
187+
return 0;
188+
}
189+
if (i == 0) {
190+
return k == 1 && j <= limit;
191+
}
192+
if (j == 0) {
193+
return k == 0 && i <= limit;
194+
}
195+
ll& res = f[i][j][k];
196+
if (res != -1) {
197+
return res;
198+
}
199+
if (k == 0) {
200+
res = (dfs(dfs, i - 1, j, 0) + dfs(dfs, i - 1, j, 1) - dfs(dfs, i - limit - 1, j, 1) + mod) % mod;
201+
} else {
202+
res = (dfs(dfs, i, j - 1, 0) + dfs(dfs, i, j - 1, 1) - dfs(dfs, i, j - limit - 1, 0) + mod) % mod;
203+
}
206204
return res;
207-
}
208-
if (k == 0) {
209-
res = (dfs(i - 1, j, 0) + dfs(i - 1, j, 1) - dfs(i - limit - 1, j, 1) + mod) % mod;
210-
} else {
211-
res = (dfs(i, j - 1, 0) + dfs(i, j - 1, 1) - dfs(i, j - limit - 1, 0) + mod) % mod;
212-
}
213-
return res;
205+
};
206+
return (dfs(dfs, zero, one, 0) + dfs(dfs, zero, one, 1)) % mod;
214207
}
215208
};
216209
```
@@ -259,6 +252,41 @@ func numberOfStableArrays(zero int, one int, limit int) int {
259252
}
260253
```
261254

255+
#### TypeScript
256+
257+
```ts
258+
function numberOfStableArrays(zero: number, one: number, limit: number): number {
259+
const mod = 1e9 + 7;
260+
const f: number[][][] = Array.from({ length: zero + 1 }, () =>
261+
Array.from({ length: one + 1 }, () => [-1, -1]),
262+
);
263+
264+
const dfs = (i: number, j: number, k: number): number => {
265+
if (i < 0 || j < 0) {
266+
return 0;
267+
}
268+
if (i === 0) {
269+
return k === 1 && j <= limit ? 1 : 0;
270+
}
271+
if (j === 0) {
272+
return k === 0 && i <= limit ? 1 : 0;
273+
}
274+
let res = f[i][j][k];
275+
if (res !== -1) {
276+
return res;
277+
}
278+
if (k === 0) {
279+
res = (dfs(i - 1, j, 0) + dfs(i - 1, j, 1) - dfs(i - limit - 1, j, 1) + mod) % mod;
280+
} else {
281+
res = (dfs(i, j - 1, 0) + dfs(i, j - 1, 1) - dfs(i, j - limit - 1, 0) + mod) % mod;
282+
}
283+
return (f[i][j][k] = res);
284+
};
285+
286+
return (dfs(zero, one, 0) + dfs(zero, one, 1)) % mod;
287+
}
288+
```
289+
262290
<!-- tabs:end -->
263291

264292
<!-- solution:end -->
@@ -295,16 +323,10 @@ class Solution:
295323
f[0][j][1] = 1
296324
for i in range(1, zero + 1):
297325
for j in range(1, one + 1):
298-
f[i][j][0] = (
299-
f[i - 1][j][0]
300-
+ f[i - 1][j][1]
301-
- (0 if i - limit - 1 < 0 else f[i - limit - 1][j][1])
302-
) % mod
303-
f[i][j][1] = (
304-
f[i][j - 1][0]
305-
+ f[i][j - 1][1]
306-
- (0 if j - limit - 1 < 0 else f[i][j - limit - 1][0])
307-
) % mod
326+
x = 0 if i - limit - 1 < 0 else f[i - limit - 1][j][1]
327+
y = 0 if j - limit - 1 < 0 else f[i][j - limit - 1][0]
328+
f[i][j][0] = (f[i - 1][j][0] + f[i - 1][j][1] - x) % mod
329+
f[i][j][1] = (f[i][j - 1][0] + f[i][j - 1][1] - y) % mod
308330
return sum(f[zero][one]) % mod
309331
```
310332

@@ -323,12 +345,10 @@ class Solution {
323345
}
324346
for (int i = 1; i <= zero; ++i) {
325347
for (int j = 1; j <= one; ++j) {
326-
f[i][j][0] = (f[i - 1][j][0] + f[i - 1][j][1]
327-
- (i - limit - 1 < 0 ? 0 : f[i - limit - 1][j][1]) + mod)
328-
% mod;
329-
f[i][j][1] = (f[i][j - 1][0] + f[i][j - 1][1]
330-
- (j - limit - 1 < 0 ? 0 : f[i][j - limit - 1][0]) + mod)
331-
% mod;
348+
long x = i - limit - 1 < 0 ? 0 : f[i - limit - 1][j][1];
349+
long y = j - limit - 1 < 0 ? 0 : f[i][j - limit - 1][0];
350+
f[i][j][0] = (f[i - 1][j][0] + f[i - 1][j][1] - x + mod) % mod;
351+
f[i][j][1] = (f[i][j - 1][0] + f[i][j - 1][1] - y + mod) % mod;
332352
}
333353
}
334354
return (int) ((f[zero][one][0] + f[zero][one][1]) % mod);
@@ -354,12 +374,10 @@ public:
354374
}
355375
for (int i = 1; i <= zero; ++i) {
356376
for (int j = 1; j <= one; ++j) {
357-
f[i][j][0] = (f[i - 1][j][0] + f[i - 1][j][1]
358-
- (i - limit - 1 < 0 ? 0 : f[i - limit - 1][j][1]) + mod)
359-
% mod;
360-
f[i][j][1] = (f[i][j - 1][0] + f[i][j - 1][1]
361-
- (j - limit - 1 < 0 ? 0 : f[i][j - limit - 1][0]) + mod)
362-
% mod;
377+
ll x = i - limit - 1 < 0 ? 0 : f[i - limit - 1][j][1];
378+
ll y = j - limit - 1 < 0 ? 0 : f[i][j - limit - 1][0];
379+
f[i][j][0] = (f[i - 1][j][0] + f[i - 1][j][1] - x + mod) % mod;
380+
f[i][j][1] = (f[i][j - 1][0] + f[i][j - 1][1] - y + mod) % mod;
363381
}
364382
}
365383
return (f[zero][one][0] + f[zero][one][1]) % mod;
@@ -398,6 +416,35 @@ func numberOfStableArrays(zero int, one int, limit int) int {
398416
}
399417
```
400418

419+
#### TypeScript
420+
421+
```ts
422+
function numberOfStableArrays(zero: number, one: number, limit: number): number {
423+
const mod = 1e9 + 7;
424+
const f: number[][][] = Array.from({ length: zero + 1 }, () =>
425+
Array.from({ length: one + 1 }, () => [0, 0]),
426+
);
427+
428+
for (let i = 1; i <= Math.min(limit, zero); i++) {
429+
f[i][0][0] = 1;
430+
}
431+
for (let j = 1; j <= Math.min(limit, one); j++) {
432+
f[0][j][1] = 1;
433+
}
434+
435+
for (let i = 1; i <= zero; i++) {
436+
for (let j = 1; j <= one; j++) {
437+
const x = i - limit - 1 < 0 ? 0 : f[i - limit - 1][j][1];
438+
const y = j - limit - 1 < 0 ? 0 : f[i][j - limit - 1][0];
439+
f[i][j][0] = (f[i - 1][j][0] + f[i - 1][j][1] - x + mod) % mod;
440+
f[i][j][1] = (f[i][j - 1][0] + f[i][j - 1][1] - y + mod) % mod;
441+
}
442+
}
443+
444+
return (f[zero][one][0] + f[zero][one][1]) % mod;
445+
}
446+
```
447+
401448
<!-- tabs:end -->
402449

403450
<!-- solution:end -->

0 commit comments

Comments
 (0)