Skip to content

Commit 0982c5d

Browse files
committed
feat: add solutions to lcof problem: No.47
剑指 Offer 47. 礼物的最大价值
1 parent 9cb8b85 commit 0982c5d

File tree

7 files changed

+129
-26
lines changed

7 files changed

+129
-26
lines changed

lcof/面试题47. 礼物的最大价值/README.md

+107-8
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ $$
4040

4141
时间复杂度 $O(m \times n)$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别为棋盘的行数和列数。
4242

43+
我们注意到 $f[i][j]$ 只与 $f[i-1][j]$ 和 $f[i][j-1]$ 有关,因此我们可以仅用两行数组 $f[2][n+1]$ 来存储状态,从而将空间复杂度优化到 $O(n)$。
44+
4345
<!-- tabs:start -->
4446

4547
### **Python3**
@@ -55,6 +57,17 @@ class Solution:
5557
return f[m][n]
5658
```
5759

60+
```python
61+
class Solution:
62+
def maxValue(self, grid: List[List[int]]) -> int:
63+
m, n = len(grid), len(grid[0])
64+
f = [[0] * (n + 1) for _ in range(2)]
65+
for i, row in enumerate(grid, 1):
66+
for j, v in enumerate(row, 1):
67+
f[i & 1][j] = max(f[i & 1 ^ 1][j], f[i & 1][j - 1]) + v
68+
return f[m & 1][n]
69+
```
70+
5871
### **Java**
5972

6073
```java
@@ -72,6 +85,21 @@ class Solution {
7285
}
7386
```
7487

88+
```java
89+
class Solution {
90+
public int maxValue(int[][] grid) {
91+
int m = grid.length, n = grid[0].length;
92+
int[][] f = new int[2][n + 1];
93+
for (int i = 1; i <= m; ++i) {
94+
for (int j = 1; j <= n; ++j) {
95+
f[i & 1][j] = Math.max(f[i & 1 ^ 1][j], f[i & 1][j - 1]) + grid[i - 1][j - 1];
96+
}
97+
}
98+
return f[m & 1][n];
99+
}
100+
}
101+
```
102+
75103
### **C++**
76104

77105
```cpp
@@ -90,6 +118,22 @@ public:
90118
};
91119
```
92120
121+
```cpp
122+
class Solution {
123+
public:
124+
int maxValue(vector<vector<int>>& grid) {
125+
int m = grid.size(), n = grid[0].size();
126+
vector<vector<int>> f(2, vector<int>(n + 1, 0));
127+
for (int i = 1; i <= m; ++i) {
128+
for (int j = 1; j <= n; ++j) {
129+
f[i & 1][j] = max(f[i & 1 ^ 1][j], f[i & 1][j - 1]) + grid[i - 1][j - 1];
130+
}
131+
}
132+
return f[m & 1][n];
133+
}
134+
};
135+
```
136+
93137
### **Go**
94138

95139
```go
@@ -115,6 +159,29 @@ func max(a, b int) int {
115159
}
116160
```
117161

162+
```go
163+
func maxValue(grid [][]int) int {
164+
m, n := len(grid), len(grid[0])
165+
f := make([][]int, 2)
166+
for i := range f {
167+
f[i] = make([]int, n+1)
168+
}
169+
for i := 1; i <= m; i++ {
170+
for j := 1; j <= n; j++ {
171+
f[i&1][j] = max(f[i&1^1][j], f[i&1][j-1]) + grid[i-1][j-1]
172+
}
173+
}
174+
return f[m&1][n]
175+
}
176+
177+
func max(a, b int) int {
178+
if a > b {
179+
return a
180+
}
181+
return b
182+
}
183+
```
184+
118185
### **JavaScript**
119186

120187
```js
@@ -125,17 +192,33 @@ func max(a, b int) int {
125192
var maxValue = function (grid) {
126193
const m = grid.length;
127194
const n = grid[0].length;
128-
let dp = new Array(m + 1);
129-
for (let i = 0; i < m + 1; ++i) {
130-
dp[i] = new Array(n + 1).fill(0);
195+
const f = new Array(m + 1).fill(0).map(() => new Array(n + 1).fill(0));
196+
for (let i = 1; i <= m; ++i) {
197+
for (let j = 1; j <= n; ++j) {
198+
f[i][j] = Math.max(f[i - 1][j], f[i][j - 1]) + grid[i - 1][j - 1];
199+
}
131200
}
132-
for (let i = 1; i < m + 1; ++i) {
133-
for (let j = 1; j < n + 1; ++j) {
134-
dp[i][j] =
135-
Math.max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
201+
return f[m][n];
202+
};
203+
```
204+
205+
```js
206+
/**
207+
* @param {number[][]} grid
208+
* @return {number}
209+
*/
210+
var maxValue = function (grid) {
211+
const m = grid.length;
212+
const n = grid[0].length;
213+
const f = new Array(2).fill(0).map(() => new Array(n + 1).fill(0));
214+
for (let i = 1; i <= m; ++i) {
215+
for (let j = 1; j <= n; ++j) {
216+
f[i & 1][j] =
217+
Math.max(f[(i & 1) ^ 1][j], f[i & 1][j - 1]) +
218+
grid[i - 1][j - 1];
136219
}
137220
}
138-
return dp[m][n];
221+
return f[m & 1][n];
139222
};
140223
```
141224

@@ -155,6 +238,22 @@ function maxValue(grid: number[][]): number {
155238
}
156239
```
157240

241+
```ts
242+
function maxValue(grid: number[][]): number {
243+
const m = grid.length;
244+
const n = grid[0].length;
245+
const f = Array.from({ length: 2 }, _ => new Array(n + 1).fill(0));
246+
for (let i = 1; i <= m; ++i) {
247+
for (let j = 1; j <= n; ++j) {
248+
f[i & 1][j] =
249+
Math.max(f[(i & 1) ^ 1][j], f[i & 1][j - 1]) +
250+
grid[i - 1][j - 1];
251+
}
252+
}
253+
return f[m & 1][n];
254+
}
255+
```
256+
158257
### **Rust**
159258

160259
```rust

lcof/面试题47. 礼物的最大价值/Solution.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ class Solution {
22
public:
33
int maxValue(vector<vector<int>>& grid) {
44
int m = grid.size(), n = grid[0].size();
5-
vector<vector<int>> f(m + 1, vector<int>(n + 1, 0));
5+
vector<vector<int>> f(2, vector<int>(n + 1, 0));
66
for (int i = 1; i <= m; ++i) {
77
for (int j = 1; j <= n; ++j) {
8-
f[i][j] = max(f[i - 1][j], f[i][j - 1]) + grid[i - 1][j - 1];
8+
f[i & 1][j] = max(f[i & 1 ^ 1][j], f[i & 1][j - 1]) + grid[i - 1][j - 1];
99
}
1010
}
11-
return f[m][n];
11+
return f[m & 1][n];
1212
}
1313
};

lcof/面试题47. 礼物的最大价值/Solution.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
func maxValue(grid [][]int) int {
22
m, n := len(grid), len(grid[0])
3-
f := make([][]int, m+1)
3+
f := make([][]int, 2)
44
for i := range f {
55
f[i] = make([]int, n+1)
66
}
77
for i := 1; i <= m; i++ {
88
for j := 1; j <= n; j++ {
9-
f[i][j] = max(f[i-1][j], f[i][j-1]) + grid[i-1][j-1]
9+
f[i&1][j] = max(f[i&1^1][j], f[i&1][j-1]) + grid[i-1][j-1]
1010
}
1111
}
12-
return f[m][n]
12+
return f[m&1][n]
1313
}
1414

1515
func max(a, b int) int {
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
class Solution {
22
public int maxValue(int[][] grid) {
33
int m = grid.length, n = grid[0].length;
4-
int[][] f = new int[m + 1][n + 1];
4+
int[][] f = new int[2][n + 1];
55
for (int i = 1; i <= m; ++i) {
66
for (int j = 1; j <= n; ++j) {
7-
f[i][j] = Math.max(f[i - 1][j], f[i][j - 1]) + grid[i - 1][j - 1];
7+
f[i & 1][j] = Math.max(f[i & 1 ^ 1][j], f[i & 1][j - 1]) + grid[i - 1][j - 1];
88
}
99
}
10-
return f[m][n];
10+
return f[m & 1][n];
1111
}
1212
}

lcof/面试题47. 礼物的最大价值/Solution.js

+5-3
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
var maxValue = function (grid) {
66
const m = grid.length;
77
const n = grid[0].length;
8-
const f = Array.from({ length: m + 1 }, _ => new Array(n + 1).fill(0));
8+
const f = new Array(2).fill(0).map(() => new Array(n + 1).fill(0));
99
for (let i = 1; i <= m; ++i) {
1010
for (let j = 1; j <= n; ++j) {
11-
f[i][j] = Math.max(f[i - 1][j], f[i][j - 1]) + grid[i - 1][j - 1];
11+
f[i & 1][j] =
12+
Math.max(f[(i & 1) ^ 1][j], f[i & 1][j - 1]) +
13+
grid[i - 1][j - 1];
1214
}
1315
}
14-
return f[m][n];
16+
return f[m & 1][n];
1517
};
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
class Solution:
22
def maxValue(self, grid: List[List[int]]) -> int:
33
m, n = len(grid), len(grid[0])
4-
f = [[0] * (n + 1) for _ in range(m + 1)]
4+
f = [[0] * (n + 1) for _ in range(2)]
55
for i, row in enumerate(grid, 1):
66
for j, v in enumerate(row, 1):
7-
f[i][j] = max(f[i - 1][j], f[i][j - 1]) + v
8-
return f[m][n]
7+
f[i & 1][j] = max(f[i & 1 ^ 1][j], f[i & 1][j - 1]) + v
8+
return f[m & 1][n]
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
function maxValue(grid: number[][]): number {
22
const m = grid.length;
33
const n = grid[0].length;
4-
const f = Array.from({ length: m + 1 }, _ => new Array(n + 1).fill(0));
4+
const f = Array.from({ length: 2 }, _ => new Array(n + 1).fill(0));
55
for (let i = 1; i <= m; ++i) {
66
for (let j = 1; j <= n; ++j) {
7-
f[i][j] = Math.max(f[i - 1][j], f[i][j - 1]) + grid[i - 1][j - 1];
7+
f[i & 1][j] =
8+
Math.max(f[(i & 1) ^ 1][j], f[i & 1][j - 1]) +
9+
grid[i - 1][j - 1];
810
}
911
}
10-
return f[m][n];
12+
return f[m & 1][n];
1113
}

0 commit comments

Comments
 (0)