Skip to content

Commit 674c364

Browse files
authored
feat: add solutions to lc problem: No.3339 (doocs#3698)
No.3339.Find the Number of K-Even Arrays
1 parent 6bea4aa commit 674c364

19 files changed

+1360
-1
lines changed

solution/3300-3399/3339.Find the Number of K-Even Arrays/README.md

+529
Large diffs are not rendered by default.

solution/3300-3399/3339.Find the Number of K-Even Arrays/README_EN.md

+527
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution {
2+
public:
3+
int countOfArrays(int n, int m, int k) {
4+
int f[n][k + 1][2];
5+
memset(f, -1, sizeof(f));
6+
const int mod = 1e9 + 7;
7+
int cnt0 = m / 2;
8+
int cnt1 = m - cnt0;
9+
auto dfs = [&](auto&& dfs, int i, int j, int k) -> int {
10+
if (j < 0) {
11+
return 0;
12+
}
13+
if (i >= n) {
14+
return j == 0 ? 1 : 0;
15+
}
16+
if (f[i][j][k] != -1) {
17+
return f[i][j][k];
18+
}
19+
int a = 1LL * cnt1 * dfs(dfs, i + 1, j, 1) % mod;
20+
int b = 1LL * cnt0 * dfs(dfs, i + 1, j - (k & 1 ^ 1), 0) % mod;
21+
return f[i][j][k] = (a + b) % mod;
22+
};
23+
return dfs(dfs, 0, k, 1);
24+
}
25+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
func countOfArrays(n int, m int, k int) int {
2+
f := make([][][2]int, n)
3+
for i := range f {
4+
f[i] = make([][2]int, k+1)
5+
for j := range f[i] {
6+
f[i][j] = [2]int{-1, -1}
7+
}
8+
}
9+
const mod int = 1e9 + 7
10+
cnt0 := m / 2
11+
cnt1 := m - cnt0
12+
var dfs func(int, int, int) int
13+
dfs = func(i, j, k int) int {
14+
if j < 0 {
15+
return 0
16+
}
17+
if i >= n {
18+
if j == 0 {
19+
return 1
20+
}
21+
return 0
22+
}
23+
if f[i][j][k] != -1 {
24+
return f[i][j][k]
25+
}
26+
a := cnt1 * dfs(i+1, j, 1) % mod
27+
b := cnt0 * dfs(i+1, j-(k&1^1), 0) % mod
28+
f[i][j][k] = (a + b) % mod
29+
return f[i][j][k]
30+
}
31+
return dfs(0, k, 1)
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution {
2+
private Integer[][][] f;
3+
private long cnt0, cnt1;
4+
private final int mod = (int) 1e9 + 7;
5+
6+
public int countOfArrays(int n, int m, int k) {
7+
f = new Integer[n][k + 1][2];
8+
cnt0 = m / 2;
9+
cnt1 = m - cnt0;
10+
return dfs(0, k, 1);
11+
}
12+
13+
private int dfs(int i, int j, int k) {
14+
if (j < 0) {
15+
return 0;
16+
}
17+
if (i >= f.length) {
18+
return j == 0 ? 1 : 0;
19+
}
20+
if (f[i][j][k] != null) {
21+
return f[i][j][k];
22+
}
23+
int a = (int) (cnt1 * dfs(i + 1, j, 1) % mod);
24+
int b = (int) (cnt0 * dfs(i + 1, j - (k & 1 ^ 1), 0) % mod);
25+
return f[i][j][k] = (a + b) % mod;
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution:
2+
def countOfArrays(self, n: int, m: int, k: int) -> int:
3+
@cache
4+
def dfs(i: int, j: int, k: int) -> int:
5+
if j < 0:
6+
return 0
7+
if i >= n:
8+
return int(j == 0)
9+
return (
10+
cnt1 * dfs(i + 1, j, 1) + cnt0 * dfs(i + 1, j - (k & 1 ^ 1), 0)
11+
) % mod
12+
13+
cnt0 = m // 2
14+
cnt1 = m - cnt0
15+
mod = 10**9 + 7
16+
ans = dfs(0, k, 1)
17+
dfs.cache_clear()
18+
return ans
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
function countOfArrays(n: number, m: number, k: number): number {
2+
const f = Array.from({ length: n }, () =>
3+
Array.from({ length: k + 1 }, () => Array(2).fill(-1)),
4+
);
5+
const mod = 1e9 + 7;
6+
const cnt0 = Math.floor(m / 2);
7+
const cnt1 = m - cnt0;
8+
const dfs = (i: number, j: number, k: number): number => {
9+
if (j < 0) {
10+
return 0;
11+
}
12+
if (i >= n) {
13+
return j === 0 ? 1 : 0;
14+
}
15+
if (f[i][j][k] !== -1) {
16+
return f[i][j][k];
17+
}
18+
const a = (cnt1 * dfs(i + 1, j, 1)) % mod;
19+
const b = (cnt0 * dfs(i + 1, j - ((k & 1) ^ 1), 0)) % mod;
20+
return (f[i][j][k] = (a + b) % mod);
21+
};
22+
return dfs(0, k, 1);
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution {
2+
public:
3+
int countOfArrays(int n, int m, int k) {
4+
int f[n + 1][k + 1][2];
5+
memset(f, 0, sizeof(f));
6+
f[0][0][1] = 1;
7+
const int mod = 1e9 + 7;
8+
int cnt0 = m / 2;
9+
int cnt1 = m - cnt0;
10+
for (int i = 1; i <= n; ++i) {
11+
for (int j = 0; j <= k; ++j) {
12+
f[i][j][0] = 1LL * (f[i - 1][j][1] + (j ? f[i - 1][j - 1][0] : 0)) * cnt0 % mod;
13+
f[i][j][1] = 1LL * (f[i - 1][j][0] + f[i - 1][j][1]) * cnt1 % mod;
14+
}
15+
}
16+
return (f[n][k][0] + f[n][k][1]) % mod;
17+
}
18+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
func countOfArrays(n int, m int, k int) int {
2+
f := make([][][2]int, n+1)
3+
for i := range f {
4+
f[i] = make([][2]int, k+1)
5+
}
6+
f[0][0][1] = 1
7+
cnt0 := m / 2
8+
cnt1 := m - cnt0
9+
const mod int = 1e9 + 7
10+
for i := 1; i <= n; i++ {
11+
for j := 0; j <= k; j++ {
12+
f[i][j][0] = cnt0 * f[i-1][j][1] % mod
13+
if j > 0 {
14+
f[i][j][0] = (f[i][j][0] + cnt0*f[i-1][j-1][0]%mod) % mod
15+
}
16+
f[i][j][1] = cnt1 * (f[i-1][j][0] + f[i-1][j][1]) % mod
17+
}
18+
}
19+
return (f[n][k][0] + f[n][k][1]) % mod
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public int countOfArrays(int n, int m, int k) {
3+
int[][][] f = new int[n + 1][k + 1][2];
4+
int cnt0 = m / 2;
5+
int cnt1 = m - cnt0;
6+
final int mod = (int) 1e9 + 7;
7+
f[0][0][1] = 1;
8+
for (int i = 1; i <= n; ++i) {
9+
for (int j = 0; j <= k; ++j) {
10+
f[i][j][0]
11+
= (int) (1L * cnt0 * (f[i - 1][j][1] + (j > 0 ? f[i - 1][j - 1][0] : 0)) % mod);
12+
f[i][j][1] = (int) (1L * cnt1 * (f[i - 1][j][0] + f[i - 1][j][1]) % mod);
13+
}
14+
}
15+
return (f[n][k][0] + f[n][k][1]) % mod;
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution:
2+
def countOfArrays(self, n: int, m: int, k: int) -> int:
3+
f = [[[0] * 2 for _ in range(k + 1)] for _ in range(n + 1)]
4+
cnt0 = m // 2
5+
cnt1 = m - cnt0
6+
mod = 10**9 + 7
7+
f[0][0][1] = 1
8+
for i in range(1, n + 1):
9+
for j in range(k + 1):
10+
f[i][j][0] = (
11+
(f[i - 1][j][1] + (f[i - 1][j - 1][0] if j else 0)) * cnt0 % mod
12+
)
13+
f[i][j][1] = (f[i - 1][j][0] + f[i - 1][j][1]) * cnt1 % mod
14+
return sum(f[n][k]) % mod
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
function countOfArrays(n: number, m: number, k: number): number {
2+
const f: number[][][] = Array.from({ length: n + 1 }, () =>
3+
Array.from({ length: k + 1 }, () => Array(2).fill(0)),
4+
);
5+
f[0][0][1] = 1;
6+
const mod = 1e9 + 7;
7+
const cnt0 = Math.floor(m / 2);
8+
const cnt1 = m - cnt0;
9+
for (let i = 1; i <= n; ++i) {
10+
for (let j = 0; j <= k; ++j) {
11+
f[i][j][0] = (cnt0 * (f[i - 1][j][1] + (j ? f[i - 1][j - 1][0] : 0))) % mod;
12+
f[i][j][1] = (cnt1 * (f[i - 1][j][0] + f[i - 1][j][1])) % mod;
13+
}
14+
}
15+
return (f[n][k][0] + f[n][k][1]) % mod;
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public:
3+
int countOfArrays(int n, int m, int k) {
4+
vector<vector<int>> f(k + 1, vector<int>(2));
5+
int cnt0 = m / 2;
6+
int cnt1 = m - cnt0;
7+
const int mod = 1e9 + 7;
8+
f[0][1] = 1;
9+
10+
for (int i = 0; i < n; ++i) {
11+
vector<vector<int>> g(k + 1, vector<int>(2));
12+
for (int j = 0; j <= k; ++j) {
13+
g[j][0] = (1LL * cnt0 * (f[j][1] + (j > 0 ? f[j - 1][0] : 0)) % mod) % mod;
14+
g[j][1] = (1LL * cnt1 * (f[j][0] + f[j][1]) % mod) % mod;
15+
}
16+
f = g;
17+
}
18+
return (f[k][0] + f[k][1]) % mod;
19+
}
20+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
func countOfArrays(n int, m int, k int) int {
2+
const mod = 1e9 + 7
3+
cnt0 := m / 2
4+
cnt1 := m - cnt0
5+
f := make([][2]int, k+1)
6+
f[0][1] = 1
7+
8+
for i := 0; i < n; i++ {
9+
g := make([][2]int, k+1)
10+
for j := 0; j <= k; j++ {
11+
g[j][0] = (cnt0 * (f[j][1] + func() int {
12+
if j > 0 {
13+
return f[j-1][0]
14+
}
15+
return 0
16+
}()) % mod) % mod
17+
g[j][1] = (cnt1 * (f[j][0] + f[j][1]) % mod) % mod
18+
}
19+
f = g
20+
}
21+
22+
return (f[k][0] + f[k][1]) % mod
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution {
2+
public int countOfArrays(int n, int m, int k) {
3+
int[][] f = new int[k + 1][2];
4+
int cnt0 = m / 2;
5+
int cnt1 = m - cnt0;
6+
final int mod = (int) 1e9 + 7;
7+
f[0][1] = 1;
8+
for (int i = 0; i < n; ++i) {
9+
int[][] g = new int[k + 1][2];
10+
for (int j = 0; j <= k; ++j) {
11+
g[j][0] = (int) (1L * cnt0 * (f[j][1] + (j > 0 ? f[j - 1][0] : 0)) % mod);
12+
g[j][1] = (int) (1L * cnt1 * (f[j][0] + f[j][1]) % mod);
13+
}
14+
f = g;
15+
}
16+
return (f[k][0] + f[k][1]) % mod;
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution:
2+
def countOfArrays(self, n: int, m: int, k: int) -> int:
3+
f = [[0] * 2 for _ in range(k + 1)]
4+
cnt0 = m // 2
5+
cnt1 = m - cnt0
6+
mod = 10**9 + 7
7+
f[0][1] = 1
8+
for _ in range(n):
9+
g = [[0] * 2 for _ in range(k + 1)]
10+
for j in range(k + 1):
11+
g[j][0] = (f[j][1] + (f[j - 1][0] if j else 0)) * cnt0 % mod
12+
g[j][1] = (f[j][0] + f[j][1]) * cnt1 % mod
13+
f = g
14+
return sum(f[k]) % mod
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
function countOfArrays(n: number, m: number, k: number): number {
2+
const mod = 1e9 + 7;
3+
const cnt0 = Math.floor(m / 2);
4+
const cnt1 = m - cnt0;
5+
const f: number[][] = Array.from({ length: k + 1 }, () => [0, 0]);
6+
f[0][1] = 1;
7+
for (let i = 0; i < n; i++) {
8+
const g: number[][] = Array.from({ length: k + 1 }, () => [0, 0]);
9+
for (let j = 0; j <= k; j++) {
10+
g[j][0] = ((cnt0 * (f[j][1] + (j > 0 ? f[j - 1][0] : 0))) % mod) % mod;
11+
g[j][1] = ((cnt1 * (f[j][0] + f[j][1])) % mod) % mod;
12+
}
13+
f.splice(0, f.length, ...g);
14+
}
15+
return (f[k][0] + f[k][1]) % mod;
16+
}

solution/README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -3349,6 +3349,7 @@
33493349
| 3336 | [最大公约数相等的子序列数量](/solution/3300-3399/3336.Find%20the%20Number%20of%20Subsequences%20With%20Equal%20GCD/README.md) | `数组`,`数学`,`动态规划`,`数论` | 困难 | 第 421 场周赛 |
33503350
| 3337 | [字符串转换后的长度 II](/solution/3300-3399/3337.Total%20Characters%20in%20String%20After%20Transformations%20II/README.md) | `哈希表`,`数学`,`字符串`,`动态规划`,`计数` | 困难 | 第 421 场周赛 |
33513351
| 3338 | [第二高的薪水 II](/solution/3300-3399/3338.Second%20Highest%20Salary%20II/README.md) | `数据库` | 中等 | 🔒 |
3352+
| 3339 | [查找 K 偶数数组的数量](/solution/3300-3399/3339.Find%20the%20Number%20of%20K-Even%20Arrays/README.md) | `动态规划` | 中等 | 🔒 |
33523353

33533354
## 版权
33543355

@@ -3359,4 +3360,4 @@
33593360
欢迎各位小伙伴们添加 @yanglbme 的个人微信(微信号:YLB0109),备注 「**leetcode**」。后续我们会创建算法、技术相关的交流群,大家一起交流学习,分享经验,共同进步。
33603361

33613362
| <img src="https://cdn-doocs.oss-cn-shenzhen.aliyuncs.com/gh/doocs/images/qrcode-for-yanglbme.png" width="260px" align="left"/> |
3362-
| ------------------------------------------------------------------------------------------------------------------------------ |
3363+
| ------------------------------------------------------------------------------------------------------------------------------ |

solution/README_EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -3347,6 +3347,7 @@ Press <kbd>Control</kbd> + <kbd>F</kbd>(or <kbd>Command</kbd> + <kbd>F</kbd> on
33473347
| 3336 | [Find the Number of Subsequences With Equal GCD](/solution/3300-3399/3336.Find%20the%20Number%20of%20Subsequences%20With%20Equal%20GCD/README_EN.md) | `Array`,`Math`,`Dynamic Programming`,`Number Theory` | Hard | Weekly Contest 421 |
33483348
| 3337 | [Total Characters in String After Transformations II](/solution/3300-3399/3337.Total%20Characters%20in%20String%20After%20Transformations%20II/README_EN.md) | `Hash Table`,`Math`,`String`,`Dynamic Programming`,`Counting` | Hard | Weekly Contest 421 |
33493349
| 3338 | [Second Highest Salary II](/solution/3300-3399/3338.Second%20Highest%20Salary%20II/README_EN.md) | `Database` | Medium | 🔒 |
3350+
| 3339 | [Find the Number of K-Even Arrays](/solution/3300-3399/3339.Find%20the%20Number%20of%20K-Even%20Arrays/README_EN.md) | `Dynamic Programming` | Medium | 🔒 |
33503351

33513352
## Copyright
33523353

0 commit comments

Comments
 (0)