Skip to content

Commit 6fab7d6

Browse files
authored
feat: add solutions to lc problem: No.3148 (#2800)
No.3148.Maximum Difference Score in a Grid
1 parent dc26c76 commit 6fab7d6

File tree

7 files changed

+333
-8
lines changed

7 files changed

+333
-8
lines changed

solution/3100-3199/3148.Maximum Difference Score in a Grid/README.md

+116-4
Original file line numberDiff line numberDiff line change
@@ -55,24 +55,136 @@
5555

5656
## 解法
5757

58-
### 方法一
58+
### 方法一:动态规划
59+
60+
根据题目描述,如果我们经过的单元格的值依次是 $c_1, c_2, \cdots, c_k$,那么我们的得分就是 $c_2 - c_1 + c_3 - c_2 + \cdots + c_k - c_{k-1} = c_k - c_1$。因此,问题转化为:对于矩阵的每个单元格 $(i, j)$,如果我们将其作为终点,那么起点的最小值是多少。
61+
62+
我们可以使用动态规划来解决这个问题。我们定义 $f[i][j]$ 表示以 $(i, j)$ 为终点的路径的最小值。那么我们可以得到状态转移方程:
63+
64+
$$
65+
f[i][j] = \min(f[i-1][j], f[i][j-1], grid[i][j])
66+
$$
67+
68+
那么答案为 $\text{grid}[i][j] - \min(f[i-1][j], f[i][j-1])$ 的最大值。
69+
70+
时间复杂度 $O(m \times n)$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别是矩阵的行数和列数。
5971

6072
<!-- tabs:start -->
6173

6274
```python
63-
75+
class Solution:
76+
def maxScore(self, grid: List[List[int]]) -> int:
77+
f = [[0] * len(grid[0]) for _ in range(len(grid))]
78+
ans = -inf
79+
for i, row in enumerate(grid):
80+
for j, x in enumerate(row):
81+
mi = inf
82+
if i:
83+
mi = min(mi, f[i - 1][j])
84+
if j:
85+
mi = min(mi, f[i][j - 1])
86+
ans = max(ans, x - mi)
87+
f[i][j] = min(x, mi)
88+
return ans
6489
```
6590

6691
```java
67-
92+
class Solution {
93+
public int maxScore(List<List<Integer>> grid) {
94+
int m = grid.size(), n = grid.get(0).size();
95+
final int inf = 1 << 30;
96+
int ans = -inf;
97+
int[][] f = new int[m][n];
98+
for (int i = 0; i < m; ++i) {
99+
for (int j = 0; j < n; ++j) {
100+
int mi = inf;
101+
if (i > 0) {
102+
mi = Math.min(mi, f[i - 1][j]);
103+
}
104+
if (j > 0) {
105+
mi = Math.min(mi, f[i][j - 1]);
106+
}
107+
ans = Math.max(ans, grid.get(i).get(j) - mi);
108+
f[i][j] = Math.min(grid.get(i).get(j), mi);
109+
}
110+
}
111+
return ans;
112+
}
113+
}
68114
```
69115

70116
```cpp
71-
117+
class Solution {
118+
public:
119+
int maxScore(vector<vector<int>>& grid) {
120+
int m = grid.size(), n = grid[0].size();
121+
const int inf = 1 << 30;
122+
int ans = -inf;
123+
int f[m][n];
124+
for (int i = 0; i < m; ++i) {
125+
for (int j = 0; j < n; ++j) {
126+
int mi = inf;
127+
if (i) {
128+
mi = min(mi, f[i - 1][j]);
129+
}
130+
if (j) {
131+
mi = min(mi, f[i][j - 1]);
132+
}
133+
ans = max(ans, grid[i][j] - mi);
134+
f[i][j] = min(grid[i][j], mi);
135+
}
136+
}
137+
return ans;
138+
}
139+
};
72140
```
73141
74142
```go
143+
func maxScore(grid [][]int) int {
144+
m, n := len(grid), len(grid[0])
145+
f := make([][]int, m)
146+
for i := range f {
147+
f[i] = make([]int, n)
148+
}
149+
const inf int = 1 << 30
150+
ans := -inf
151+
for i, row := range grid {
152+
for j, x := range row {
153+
mi := inf
154+
if i > 0 {
155+
mi = min(mi, f[i-1][j])
156+
}
157+
if j > 0 {
158+
mi = min(mi, f[i][j-1])
159+
}
160+
ans = max(ans, x-mi)
161+
f[i][j] = min(x, mi)
162+
}
163+
}
164+
return ans
165+
}
166+
```
75167

168+
```ts
169+
function maxScore(grid: number[][]): number {
170+
const [m, n] = [grid.length, grid[0].length];
171+
const f: number[][] = Array.from({ length: m }, () => Array.from({ length: n }, () => 0));
172+
let ans = -Infinity;
173+
for (let i = 0; i < m; ++i) {
174+
for (let j = 0; j < n; ++j) {
175+
let mi = Infinity;
176+
if (i) {
177+
mi = Math.min(mi, f[i - 1][j]);
178+
}
179+
if (j) {
180+
mi = Math.min(mi, f[i][j - 1]);
181+
}
182+
ans = Math.max(ans, grid[i][j] - mi);
183+
f[i][j] = Math.min(mi, grid[i][j]);
184+
}
185+
}
186+
return ans;
187+
}
76188
```
77189

78190
<!-- tabs:end -->

solution/3100-3199/3148.Maximum Difference Score in a Grid/README_EN.md

+116-4
Original file line numberDiff line numberDiff line change
@@ -51,24 +51,136 @@ The total score is <code>2 + 7 = 9</code>.</p>
5151

5252
## Solutions
5353

54-
### Solution 1
54+
### Solution 1: Dynamic Programming
55+
56+
According to the problem description, if the values of the cells we pass through are $c_1, c_2, \cdots, c_k$, then our score is $c_2 - c_1 + c_3 - c_2 + \cdots + c_k - c_{k-1} = c_k - c_1$. Therefore, the problem is transformed into: for each cell $(i, j)$ of the matrix, if we take it as the endpoint, what is the minimum value of the starting point.
57+
58+
We can use dynamic programming to solve this problem. We define $f[i][j]$ as the minimum value of the path with $(i, j)$ as the endpoint. Then we can get the state transition equation:
59+
60+
$$
61+
f[i][j] = \min(f[i-1][j], f[i][j-1], grid[i][j])
62+
$$
63+
64+
So the answer is the maximum value of $\text{grid}[i][j] - \min(f[i-1][j], f[i][j-1])$.
65+
66+
The time complexity is $O(m \times n)$, and the space complexity is $O(m \times n)$. Where $m$ and $n$ are the number of rows and columns of the matrix, respectively.
5567

5668
<!-- tabs:start -->
5769

5870
```python
59-
71+
class Solution:
72+
def maxScore(self, grid: List[List[int]]) -> int:
73+
f = [[0] * len(grid[0]) for _ in range(len(grid))]
74+
ans = -inf
75+
for i, row in enumerate(grid):
76+
for j, x in enumerate(row):
77+
mi = inf
78+
if i:
79+
mi = min(mi, f[i - 1][j])
80+
if j:
81+
mi = min(mi, f[i][j - 1])
82+
ans = max(ans, x - mi)
83+
f[i][j] = min(x, mi)
84+
return ans
6085
```
6186

6287
```java
63-
88+
class Solution {
89+
public int maxScore(List<List<Integer>> grid) {
90+
int m = grid.size(), n = grid.get(0).size();
91+
final int inf = 1 << 30;
92+
int ans = -inf;
93+
int[][] f = new int[m][n];
94+
for (int i = 0; i < m; ++i) {
95+
for (int j = 0; j < n; ++j) {
96+
int mi = inf;
97+
if (i > 0) {
98+
mi = Math.min(mi, f[i - 1][j]);
99+
}
100+
if (j > 0) {
101+
mi = Math.min(mi, f[i][j - 1]);
102+
}
103+
ans = Math.max(ans, grid.get(i).get(j) - mi);
104+
f[i][j] = Math.min(grid.get(i).get(j), mi);
105+
}
106+
}
107+
return ans;
108+
}
109+
}
64110
```
65111

66112
```cpp
67-
113+
class Solution {
114+
public:
115+
int maxScore(vector<vector<int>>& grid) {
116+
int m = grid.size(), n = grid[0].size();
117+
const int inf = 1 << 30;
118+
int ans = -inf;
119+
int f[m][n];
120+
for (int i = 0; i < m; ++i) {
121+
for (int j = 0; j < n; ++j) {
122+
int mi = inf;
123+
if (i) {
124+
mi = min(mi, f[i - 1][j]);
125+
}
126+
if (j) {
127+
mi = min(mi, f[i][j - 1]);
128+
}
129+
ans = max(ans, grid[i][j] - mi);
130+
f[i][j] = min(grid[i][j], mi);
131+
}
132+
}
133+
return ans;
134+
}
135+
};
68136
```
69137
70138
```go
139+
func maxScore(grid [][]int) int {
140+
m, n := len(grid), len(grid[0])
141+
f := make([][]int, m)
142+
for i := range f {
143+
f[i] = make([]int, n)
144+
}
145+
const inf int = 1 << 30
146+
ans := -inf
147+
for i, row := range grid {
148+
for j, x := range row {
149+
mi := inf
150+
if i > 0 {
151+
mi = min(mi, f[i-1][j])
152+
}
153+
if j > 0 {
154+
mi = min(mi, f[i][j-1])
155+
}
156+
ans = max(ans, x-mi)
157+
f[i][j] = min(x, mi)
158+
}
159+
}
160+
return ans
161+
}
162+
```
71163

164+
```ts
165+
function maxScore(grid: number[][]): number {
166+
const [m, n] = [grid.length, grid[0].length];
167+
const f: number[][] = Array.from({ length: m }, () => Array.from({ length: n }, () => 0));
168+
let ans = -Infinity;
169+
for (let i = 0; i < m; ++i) {
170+
for (let j = 0; j < n; ++j) {
171+
let mi = Infinity;
172+
if (i) {
173+
mi = Math.min(mi, f[i - 1][j]);
174+
}
175+
if (j) {
176+
mi = Math.min(mi, f[i][j - 1]);
177+
}
178+
ans = Math.max(ans, grid[i][j] - mi);
179+
f[i][j] = Math.min(mi, grid[i][j]);
180+
}
181+
}
182+
return ans;
183+
}
72184
```
73185

74186
<!-- tabs:end -->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public:
3+
int maxScore(vector<vector<int>>& grid) {
4+
int m = grid.size(), n = grid[0].size();
5+
const int inf = 1 << 30;
6+
int ans = -inf;
7+
int f[m][n];
8+
for (int i = 0; i < m; ++i) {
9+
for (int j = 0; j < n; ++j) {
10+
int mi = inf;
11+
if (i) {
12+
mi = min(mi, f[i - 1][j]);
13+
}
14+
if (j) {
15+
mi = min(mi, f[i][j - 1]);
16+
}
17+
ans = max(ans, grid[i][j] - mi);
18+
f[i][j] = min(grid[i][j], mi);
19+
}
20+
}
21+
return ans;
22+
}
23+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
func maxScore(grid [][]int) int {
2+
m, n := len(grid), len(grid[0])
3+
f := make([][]int, m)
4+
for i := range f {
5+
f[i] = make([]int, n)
6+
}
7+
const inf int = 1 << 30
8+
ans := -inf
9+
for i, row := range grid {
10+
for j, x := range row {
11+
mi := inf
12+
if i > 0 {
13+
mi = min(mi, f[i-1][j])
14+
}
15+
if j > 0 {
16+
mi = min(mi, f[i][j-1])
17+
}
18+
ans = max(ans, x-mi)
19+
f[i][j] = min(x, mi)
20+
}
21+
}
22+
return ans
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public int maxScore(List<List<Integer>> grid) {
3+
int m = grid.size(), n = grid.get(0).size();
4+
final int inf = 1 << 30;
5+
int ans = -inf;
6+
int[][] f = new int[m][n];
7+
for (int i = 0; i < m; ++i) {
8+
for (int j = 0; j < n; ++j) {
9+
int mi = inf;
10+
if (i > 0) {
11+
mi = Math.min(mi, f[i - 1][j]);
12+
}
13+
if (j > 0) {
14+
mi = Math.min(mi, f[i][j - 1]);
15+
}
16+
ans = Math.max(ans, grid.get(i).get(j) - mi);
17+
f[i][j] = Math.min(grid.get(i).get(j), mi);
18+
}
19+
}
20+
return ans;
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution:
2+
def maxScore(self, grid: List[List[int]]) -> int:
3+
f = [[0] * len(grid[0]) for _ in range(len(grid))]
4+
ans = -inf
5+
for i, row in enumerate(grid):
6+
for j, x in enumerate(row):
7+
mi = inf
8+
if i:
9+
mi = min(mi, f[i - 1][j])
10+
if j:
11+
mi = min(mi, f[i][j - 1])
12+
ans = max(ans, x - mi)
13+
f[i][j] = min(x, mi)
14+
return ans
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
function maxScore(grid: number[][]): number {
2+
const [m, n] = [grid.length, grid[0].length];
3+
const f: number[][] = Array.from({ length: m }, () => Array.from({ length: n }, () => 0));
4+
let ans = -Infinity;
5+
for (let i = 0; i < m; ++i) {
6+
for (let j = 0; j < n; ++j) {
7+
let mi = Infinity;
8+
if (i) {
9+
mi = Math.min(mi, f[i - 1][j]);
10+
}
11+
if (j) {
12+
mi = Math.min(mi, f[i][j - 1]);
13+
}
14+
ans = Math.max(ans, grid[i][j] - mi);
15+
f[i][j] = Math.min(mi, grid[i][j]);
16+
}
17+
}
18+
return ans;
19+
}

0 commit comments

Comments
 (0)