Skip to content

Commit 7e91d18

Browse files
committed
feat: update solutions to lc problem: No.2428
No.2428.Maximum Sum of an Hourglass
1 parent 707af68 commit 7e91d18

File tree

7 files changed

+80
-122
lines changed

7 files changed

+80
-122
lines changed

solution/2400-2499/2428.Maximum Sum of an Hourglass/README.md

+28-42
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@
4747

4848
**方法一:枚举**
4949

50-
从左上角开始,枚举每个可能的沙漏的中间坐标 $(i, j)$,计算沙漏的元素和,取最大值即可
50+
我们观察题目发现,每个沙漏就是一个 $3 \times 3$ 的矩阵挖去中间行的首尾两个元素。因此,我们可以从左上角开始,枚举每个沙漏的中间坐标 $(i, j)$,然后计算沙漏的元素和,取其中的最大值即可
5151

52-
时间复杂度 $O(m\times n)$。其中 $m$ 和 $n$ 分别是矩阵的行数和列数。
52+
时间复杂度 $O(m \times n)$,空间复杂度 $O(1)$。其中 $m$ 和 $n$ 分别是矩阵的行数和列数。
5353

5454
<!-- tabs:start -->
5555

@@ -64,14 +64,10 @@ class Solution:
6464
ans = 0
6565
for i in range(1, m - 1):
6666
for j in range(1, n - 1):
67-
t = 0
68-
for x in [i - 1, i, i + 1]:
69-
for y in [j - 1, j, j + 1]:
70-
t += grid[x][y]
71-
72-
t -= grid[i][j - 1]
73-
t -= grid[i][j + 1]
74-
ans = max(ans, t)
67+
s = -grid[i][j - 1] - grid[i][j + 1]
68+
s += sum(grid[x][y] for x in range(i - 1, i + 2)
69+
for y in range(j - 1, j + 2))
70+
ans = max(ans, s)
7571
return ans
7672
```
7773

@@ -86,15 +82,13 @@ class Solution {
8682
int ans = 0;
8783
for (int i = 1; i < m - 1; ++i) {
8884
for (int j = 1; j < n - 1; ++j) {
89-
int t = 0;
85+
int s = -grid[i][j - 1] - grid[i][j + 1];
9086
for (int x = i - 1; x <= i + 1; ++x) {
9187
for (int y = j - 1; y <= j + 1; ++y) {
92-
t += grid[x][y];
88+
s += grid[x][y];
9389
}
9490
}
95-
t -= grid[i][j - 1];
96-
t -= grid[i][j + 1];
97-
ans = Math.max(ans, t);
91+
ans = Math.max(ans, s);
9892
}
9993
}
10094
return ans;
@@ -112,15 +106,13 @@ public:
112106
int ans = 0;
113107
for (int i = 1; i < m - 1; ++i) {
114108
for (int j = 1; j < n - 1; ++j) {
115-
int t = 0;
109+
int s = -grid[i][j - 1] - grid[i][j + 1];
116110
for (int x = i - 1; x <= i + 1; ++x) {
117111
for (int y = j - 1; y <= j + 1; ++y) {
118-
t += grid[x][y];
112+
s += grid[x][y];
119113
}
120114
}
121-
t -= grid[i][j - 1];
122-
t -= grid[i][j + 1];
123-
ans = max(ans, t);
115+
ans = max(ans, s);
124116
}
125117
}
126118
return ans;
@@ -131,23 +123,20 @@ public:
131123
### **Go**
132124
133125
```go
134-
func maxSum(grid [][]int) int {
126+
func maxSum(grid [][]int) (ans int) {
135127
m, n := len(grid), len(grid[0])
136-
ans := 0
137128
for i := 1; i < m-1; i++ {
138129
for j := 1; j < n-1; j++ {
139-
t := 0
130+
s := -grid[i][j-1] - grid[i][j+1]
140131
for x := i - 1; x <= i+1; x++ {
141132
for y := j - 1; y <= j+1; y++ {
142-
t += grid[x][y]
133+
s += grid[x][y]
143134
}
144135
}
145-
t -= grid[i][j-1]
146-
t -= grid[i][j+1]
147-
ans = max(ans, t)
136+
ans = max(ans, s)
148137
}
149138
}
150-
return ans
139+
return
151140
}
152141
153142
func max(a, b int) int {
@@ -162,21 +151,18 @@ func max(a, b int) int {
162151

163152
```ts
164153
function maxSum(grid: number[][]): number {
165-
const m = grid.length,
166-
n = grid[0].length;
167-
let threeSum = Array.from({ length: m }, () => new Array(n - 2).fill(0));
168-
for (let i = 0; i < m; i++) {
169-
for (let j = 1; j < n - 1; j++) {
170-
threeSum[i][j - 1] = grid[i][j - 1] + grid[i][j] + grid[i][j + 1];
171-
}
172-
}
154+
const m = grid.length;
155+
const n = grid[0].length;
173156
let ans = 0;
174-
for (let i = 1; i < m - 1; i++) {
175-
for (let j = 1; j < n - 1; j++) {
176-
ans = Math.max(
177-
ans,
178-
threeSum[i - 1][j - 1] + grid[i][j] + threeSum[i + 1][j - 1],
179-
);
157+
for (let i = 1; i < m - 1; ++i) {
158+
for (let j = 1; j < n - 1; ++j) {
159+
let s = -grid[i][j - 1] - grid[i][j + 1];
160+
for (let x = i - 1; x <= i + 1; ++x) {
161+
for (let y = j - 1; y <= j + 1; ++y) {
162+
s += grid[x][y];
163+
}
164+
}
165+
ans = Math.max(ans, s);
180166
}
181167
}
182168
return ans;

solution/2400-2499/2428.Maximum Sum of an Hourglass/README_EN.md

+26-40
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,10 @@ class Solution:
5252
ans = 0
5353
for i in range(1, m - 1):
5454
for j in range(1, n - 1):
55-
t = 0
56-
for x in [i - 1, i, i + 1]:
57-
for y in [j - 1, j, j + 1]:
58-
t += grid[x][y]
59-
60-
t -= grid[i][j - 1]
61-
t -= grid[i][j + 1]
62-
ans = max(ans, t)
55+
s = -grid[i][j - 1] - grid[i][j + 1]
56+
s += sum(grid[x][y] for x in range(i - 1, i + 2)
57+
for y in range(j - 1, j + 2))
58+
ans = max(ans, s)
6359
return ans
6460
```
6561

@@ -72,15 +68,13 @@ class Solution {
7268
int ans = 0;
7369
for (int i = 1; i < m - 1; ++i) {
7470
for (int j = 1; j < n - 1; ++j) {
75-
int t = 0;
71+
int s = -grid[i][j - 1] - grid[i][j + 1];
7672
for (int x = i - 1; x <= i + 1; ++x) {
7773
for (int y = j - 1; y <= j + 1; ++y) {
78-
t += grid[x][y];
74+
s += grid[x][y];
7975
}
8076
}
81-
t -= grid[i][j - 1];
82-
t -= grid[i][j + 1];
83-
ans = Math.max(ans, t);
77+
ans = Math.max(ans, s);
8478
}
8579
}
8680
return ans;
@@ -98,15 +92,13 @@ public:
9892
int ans = 0;
9993
for (int i = 1; i < m - 1; ++i) {
10094
for (int j = 1; j < n - 1; ++j) {
101-
int t = 0;
95+
int s = -grid[i][j - 1] - grid[i][j + 1];
10296
for (int x = i - 1; x <= i + 1; ++x) {
10397
for (int y = j - 1; y <= j + 1; ++y) {
104-
t += grid[x][y];
98+
s += grid[x][y];
10599
}
106100
}
107-
t -= grid[i][j - 1];
108-
t -= grid[i][j + 1];
109-
ans = max(ans, t);
101+
ans = max(ans, s);
110102
}
111103
}
112104
return ans;
@@ -117,23 +109,20 @@ public:
117109
### **Go**
118110
119111
```go
120-
func maxSum(grid [][]int) int {
112+
func maxSum(grid [][]int) (ans int) {
121113
m, n := len(grid), len(grid[0])
122-
ans := 0
123114
for i := 1; i < m-1; i++ {
124115
for j := 1; j < n-1; j++ {
125-
t := 0
116+
s := -grid[i][j-1] - grid[i][j+1]
126117
for x := i - 1; x <= i+1; x++ {
127118
for y := j - 1; y <= j+1; y++ {
128-
t += grid[x][y]
119+
s += grid[x][y]
129120
}
130121
}
131-
t -= grid[i][j-1]
132-
t -= grid[i][j+1]
133-
ans = max(ans, t)
122+
ans = max(ans, s)
134123
}
135124
}
136-
return ans
125+
return
137126
}
138127
139128
func max(a, b int) int {
@@ -148,21 +137,18 @@ func max(a, b int) int {
148137

149138
```ts
150139
function maxSum(grid: number[][]): number {
151-
const m = grid.length,
152-
n = grid[0].length;
153-
let threeSum = Array.from({ length: m }, () => new Array(n - 2).fill(0));
154-
for (let i = 0; i < m; i++) {
155-
for (let j = 1; j < n - 1; j++) {
156-
threeSum[i][j - 1] = grid[i][j - 1] + grid[i][j] + grid[i][j + 1];
157-
}
158-
}
140+
const m = grid.length;
141+
const n = grid[0].length;
159142
let ans = 0;
160-
for (let i = 1; i < m - 1; i++) {
161-
for (let j = 1; j < n - 1; j++) {
162-
ans = Math.max(
163-
ans,
164-
threeSum[i - 1][j - 1] + grid[i][j] + threeSum[i + 1][j - 1],
165-
);
143+
for (let i = 1; i < m - 1; ++i) {
144+
for (let j = 1; j < n - 1; ++j) {
145+
let s = -grid[i][j - 1] - grid[i][j + 1];
146+
for (let x = i - 1; x <= i + 1; ++x) {
147+
for (let y = j - 1; y <= j + 1; ++y) {
148+
s += grid[x][y];
149+
}
150+
}
151+
ans = Math.max(ans, s);
166152
}
167153
}
168154
return ans;

solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.cpp

+3-5
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,13 @@ class Solution {
55
int ans = 0;
66
for (int i = 1; i < m - 1; ++i) {
77
for (int j = 1; j < n - 1; ++j) {
8-
int t = 0;
8+
int s = -grid[i][j - 1] - grid[i][j + 1];
99
for (int x = i - 1; x <= i + 1; ++x) {
1010
for (int y = j - 1; y <= j + 1; ++y) {
11-
t += grid[x][y];
11+
s += grid[x][y];
1212
}
1313
}
14-
t -= grid[i][j - 1];
15-
t -= grid[i][j + 1];
16-
ans = max(ans, t);
14+
ans = max(ans, s);
1715
}
1816
}
1917
return ans;

solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.go

+5-8
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
1-
func maxSum(grid [][]int) int {
1+
func maxSum(grid [][]int) (ans int) {
22
m, n := len(grid), len(grid[0])
3-
ans := 0
43
for i := 1; i < m-1; i++ {
54
for j := 1; j < n-1; j++ {
6-
t := 0
5+
s := -grid[i][j-1] - grid[i][j+1]
76
for x := i - 1; x <= i+1; x++ {
87
for y := j - 1; y <= j+1; y++ {
9-
t += grid[x][y]
8+
s += grid[x][y]
109
}
1110
}
12-
t -= grid[i][j-1]
13-
t -= grid[i][j+1]
14-
ans = max(ans, t)
11+
ans = max(ans, s)
1512
}
1613
}
17-
return ans
14+
return
1815
}
1916

2017
func max(a, b int) int {

solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.java

+3-5
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,13 @@ public int maxSum(int[][] grid) {
44
int ans = 0;
55
for (int i = 1; i < m - 1; ++i) {
66
for (int j = 1; j < n - 1; ++j) {
7-
int t = 0;
7+
int s = -grid[i][j - 1] - grid[i][j + 1];
88
for (int x = i - 1; x <= i + 1; ++x) {
99
for (int y = j - 1; y <= j + 1; ++y) {
10-
t += grid[x][y];
10+
s += grid[x][y];
1111
}
1212
}
13-
t -= grid[i][j - 1];
14-
t -= grid[i][j + 1];
15-
ans = Math.max(ans, t);
13+
ans = Math.max(ans, s);
1614
}
1715
}
1816
return ans;

solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.py

+4-8
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,8 @@ def maxSum(self, grid: List[List[int]]) -> int:
44
ans = 0
55
for i in range(1, m - 1):
66
for j in range(1, n - 1):
7-
t = 0
8-
for x in [i - 1, i, i + 1]:
9-
for y in [j - 1, j, j + 1]:
10-
t += grid[x][y]
11-
12-
t -= grid[i][j - 1]
13-
t -= grid[i][j + 1]
14-
ans = max(ans, t)
7+
s = -grid[i][j - 1] - grid[i][j + 1]
8+
s += sum(grid[x][y] for x in range(i - 1, i + 2)
9+
for y in range(j - 1, j + 2))
10+
ans = max(ans, s)
1511
return ans

solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.ts

+11-14
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
11
function maxSum(grid: number[][]): number {
2-
const m = grid.length,
3-
n = grid[0].length;
4-
let threeSum = Array.from({ length: m }, () => new Array(n - 2).fill(0));
5-
for (let i = 0; i < m; i++) {
6-
for (let j = 1; j < n - 1; j++) {
7-
threeSum[i][j - 1] = grid[i][j - 1] + grid[i][j] + grid[i][j + 1];
8-
}
9-
}
2+
const m = grid.length;
3+
const n = grid[0].length;
104
let ans = 0;
11-
for (let i = 1; i < m - 1; i++) {
12-
for (let j = 1; j < n - 1; j++) {
13-
ans = Math.max(
14-
ans,
15-
threeSum[i - 1][j - 1] + grid[i][j] + threeSum[i + 1][j - 1],
16-
);
5+
for (let i = 1; i < m - 1; ++i) {
6+
for (let j = 1; j < n - 1; ++j) {
7+
let s = -grid[i][j - 1] - grid[i][j + 1];
8+
for (let x = i - 1; x <= i + 1; ++x) {
9+
for (let y = j - 1; y <= j + 1; ++y) {
10+
s += grid[x][y];
11+
}
12+
}
13+
ans = Math.max(ans, s);
1714
}
1815
}
1916
return ans;

0 commit comments

Comments
 (0)