Skip to content

Commit 1505c01

Browse files
committed
feat: add solutions to lc problem: No.2435
1 parent 1453d58 commit 1505c01

File tree

12 files changed

+334
-653
lines changed

12 files changed

+334
-653
lines changed

solution/2400-2499/2435.Paths in Matrix Whose Sum Is Divisible by K/README.md

Lines changed: 112 additions & 230 deletions
Large diffs are not rendered by default.

solution/2400-2499/2435.Paths in Matrix Whose Sum Is Divisible by K/README_EN.md

Lines changed: 112 additions & 230 deletions
Large diffs are not rendered by default.
Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
11
class Solution {
22
public:
3-
int numberOfPaths(vector<vector<int>>& grid, int k) {
3+
int numberOfPaths(vector<vector<int>>& grid, int K) {
4+
const int mod = 1e9 + 7;
45
int m = grid.size(), n = grid[0].size();
5-
int mod = 1e9 + 7;
6-
vector<vector<vector<int>>> f(m, vector<vector<int>>(n, vector<int>(k, -1)));
7-
function<int(int, int, int)> dfs;
8-
dfs = [&](int i, int j, int s) {
9-
if (i < 0 || i >= m || j < 0 || j >= n) return 0;
10-
s = (s + grid[i][j]) % k;
11-
if (i == m - 1 && j == n - 1) return s == 0 ? 1 : 0;
12-
if (f[i][j][s] != -1) return f[i][j][s];
13-
int ans = dfs(i + 1, j, s) + dfs(i, j + 1, s);
14-
ans %= mod;
15-
f[i][j][s] = ans;
16-
return ans;
17-
};
18-
return dfs(0, 0, 0);
6+
int f[m][n][K];
7+
memset(f, 0, sizeof(f));
8+
f[0][0][grid[0][0] % K] = 1;
9+
for (int i = 0; i < m; ++i) {
10+
for (int j = 0; j < n; ++j) {
11+
for (int k = 0; k < K; ++k) {
12+
int k0 = ((k - grid[i][j] % K) + K) % K;
13+
if (i > 0) {
14+
f[i][j][k] = (f[i][j][k] + f[i - 1][j][k0]) % mod;
15+
}
16+
if (j > 0) {
17+
f[i][j][k] = (f[i][j][k] + f[i][j - 1][k0]) % mod;
18+
}
19+
}
20+
}
21+
}
22+
return f[m - 1][n - 1][0];
1923
}
20-
};
24+
};
Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,26 @@
1-
func numberOfPaths(grid [][]int, k int) int {
1+
func numberOfPaths(grid [][]int, K int) int {
2+
const mod = 1e9 + 7
23
m, n := len(grid), len(grid[0])
3-
var mod int = 1e9 + 7
44
f := make([][][]int, m)
55
for i := range f {
66
f[i] = make([][]int, n)
77
for j := range f[i] {
8-
f[i][j] = make([]int, k)
9-
for x := 0; x < k; x++ {
10-
f[i][j][x] = -1
11-
}
8+
f[i][j] = make([]int, K)
129
}
1310
}
14-
var dfs func(i, j, s int) int
15-
dfs = func(i, j, s int) int {
16-
if i < 0 || i >= m || j < 0 || j >= n {
17-
return 0
18-
}
19-
s = (s + grid[i][j]) % k
20-
if i == m-1 && j == n-1 {
21-
if s == 0 {
22-
return 1
11+
f[0][0][grid[0][0]%K] = 1
12+
for i := 0; i < m; i++ {
13+
for j := 0; j < n; j++ {
14+
for k := 0; k < K; k++ {
15+
k0 := ((k - grid[i][j]%K) + K) % K
16+
if i > 0 {
17+
f[i][j][k] = (f[i][j][k] + f[i-1][j][k0]) % mod
18+
}
19+
if j > 0 {
20+
f[i][j][k] = (f[i][j][k] + f[i][j-1][k0]) % mod
21+
}
2322
}
24-
return 0
25-
}
26-
if f[i][j][s] != -1 {
27-
return f[i][j][s]
2823
}
29-
ans := dfs(i+1, j, s) + dfs(i, j+1, s)
30-
ans %= mod
31-
f[i][j][s] = ans
32-
return ans
3324
}
34-
return dfs(0, 0, 0)
35-
}
25+
return f[m-1][n-1][0]
26+
}
Lines changed: 18 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,22 @@
11
class Solution {
2-
private int m;
3-
private int n;
4-
private int k;
5-
private static final int MOD = (int) 1e9 + 7;
6-
private int[][] grid;
7-
private int[][][] f;
8-
9-
public int numberOfPaths(int[][] grid, int k) {
10-
this.grid = grid;
11-
this.k = k;
12-
m = grid.length;
13-
n = grid[0].length;
14-
f = new int[m][n][k];
15-
for (var a : f) {
16-
for (var b : a) {
17-
Arrays.fill(b, -1);
2+
public int numberOfPaths(int[][] grid, int K) {
3+
final int mod = (int) 1e9 + 7;
4+
int m = grid.length, n = grid[0].length;
5+
int[][][] f = new int[m][n][K];
6+
f[0][0][grid[0][0] % K] = 1;
7+
for (int i = 0; i < m; ++i) {
8+
for (int j = 0; j < n; ++j) {
9+
for (int k = 0; k < K; ++k) {
10+
int k0 = ((k - grid[i][j] % K) + K) % K;
11+
if (i > 0) {
12+
f[i][j][k] = (f[i][j][k] + f[i - 1][j][k0]) % mod;
13+
}
14+
if (j > 0) {
15+
f[i][j][k] = (f[i][j][k] + f[i][j - 1][k0]) % mod;
16+
}
17+
}
1818
}
1919
}
20-
return dfs(0, 0, 0);
20+
return f[m - 1][n - 1][0];
2121
}
22-
23-
private int dfs(int i, int j, int s) {
24-
if (i < 0 || i >= m || j < 0 || j >= n) {
25-
return 0;
26-
}
27-
s = (s + grid[i][j]) % k;
28-
if (f[i][j][s] != -1) {
29-
return f[i][j][s];
30-
}
31-
if (i == m - 1 && j == n - 1) {
32-
return s == 0 ? 1 : 0;
33-
}
34-
int ans = dfs(i + 1, j, s) + dfs(i, j + 1, s);
35-
ans %= MOD;
36-
f[i][j][s] = ans;
37-
return ans;
38-
}
39-
}
22+
}
Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
class Solution:
2-
def numberOfPaths(self, grid: List[List[int]], k: int) -> int:
3-
@cache
4-
def dfs(i, j, s):
5-
if i < 0 or i >= m or j < 0 or j >= n:
6-
return 0
7-
s = (s + grid[i][j]) % k
8-
if i == m - 1 and j == n - 1:
9-
return int(s == 0)
10-
ans = dfs(i + 1, j, s) + dfs(i, j + 1, s)
11-
return ans % mod
12-
13-
m, n = len(grid), len(grid[0])
2+
def numberOfPaths(self, grid: List[List[int]], K: int) -> int:
143
mod = 10**9 + 7
15-
ans = dfs(0, 0, 0)
16-
dfs.cache_clear()
17-
return ans
4+
m, n = len(grid), len(grid[0])
5+
f = [[[0] * K for _ in range(n)] for _ in range(m)]
6+
f[0][0][grid[0][0] % K] = 1
7+
for i in range(m):
8+
for j in range(n):
9+
for k in range(K):
10+
k0 = ((k - grid[i][j] % K) + K) % K
11+
if i:
12+
f[i][j][k] += f[i - 1][j][k0]
13+
if j:
14+
f[i][j][k] += f[i][j - 1][k0]
15+
f[i][j][k] %= mod
16+
return f[m - 1][n - 1][0]
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
impl Solution {
2+
pub fn number_of_paths(grid: Vec<Vec<i32>>, K: i32) -> i32 {
3+
const MOD: i32 = 1_000_000_007;
4+
let m = grid.len();
5+
let n = grid[0].len();
6+
let K = K as usize;
7+
let mut f = vec![vec![vec![0; K]; n]; m];
8+
f[0][0][grid[0][0] as usize % K] = 1;
9+
for i in 0..m {
10+
for j in 0..n {
11+
for k in 0..K {
12+
let k0 = ((k + K - grid[i][j] as usize % K) % K) as usize;
13+
if i > 0 {
14+
f[i][j][k] = (f[i][j][k] + f[i - 1][j][k0]) % MOD;
15+
}
16+
if j > 0 {
17+
f[i][j][k] = (f[i][j][k] + f[i][j - 1][k0]) % MOD;
18+
}
19+
}
20+
}
21+
}
22+
f[m - 1][n - 1][0]
23+
}
24+
}
Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
1-
function numberOfPaths(grid: number[][], k: number): number {
2-
const MOD = 10 ** 9 + 7;
3-
const m = grid.length,
4-
n = grid[0].length;
5-
let ans = Array.from({ length: m + 1 }, () =>
6-
Array.from({ length: n + 1 }, () => new Array(k).fill(0)),
1+
function numberOfPaths(grid: number[][], K: number): number {
2+
const mod = 1e9 + 7;
3+
const m = grid.length;
4+
const n = grid[0].length;
5+
const f: number[][][] = Array.from({ length: m }, () =>
6+
Array.from({ length: n }, () => Array(K).fill(0)),
77
);
8-
ans[0][1][0] = 1;
9-
for (let i = 0; i < m; i++) {
10-
for (let j = 0; j < n; j++) {
11-
for (let v = 0; v < k; v++) {
12-
let key = (grid[i][j] + v) % k;
13-
ans[i + 1][j + 1][key] =
14-
(ans[i][j + 1][v] + ans[i + 1][j][v] + ans[i + 1][j + 1][key]) % MOD;
8+
f[0][0][grid[0][0] % K] = 1;
9+
for (let i = 0; i < m; ++i) {
10+
for (let j = 0; j < n; ++j) {
11+
for (let k = 0; k < K; ++k) {
12+
const k0 = (k - (grid[i][j] % K) + K) % K;
13+
if (i > 0) {
14+
f[i][j][k] = (f[i][j][k] + f[i - 1][j][k0]) % mod;
15+
}
16+
if (j > 0) {
17+
f[i][j][k] = (f[i][j][k] + f[i][j - 1][k0]) % mod;
18+
}
1519
}
1620
}
1721
}
18-
return ans[m][n][0];
22+
return f[m - 1][n - 1][0];
1923
}

solution/2400-2499/2435.Paths in Matrix Whose Sum Is Divisible by K/Solution2.cpp

Lines changed: 0 additions & 21 deletions
This file was deleted.

solution/2400-2499/2435.Paths in Matrix Whose Sum Is Divisible by K/Solution2.go

Lines changed: 0 additions & 27 deletions
This file was deleted.

0 commit comments

Comments
 (0)