Skip to content

Commit 5fdf146

Browse files
committed
feat: add solutions to lc problem: No.1895.Largest Magic Square
1 parent 2729a3c commit 5fdf146

File tree

6 files changed

+660
-0
lines changed

6 files changed

+660
-0
lines changed

solution/1800-1899/1895.Largest Magic Square/README.md

Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,22 +44,246 @@
4444

4545
<!-- 这里可写通用的实现逻辑 -->
4646

47+
先求每行、每列的前缀和。然后从大到小枚举尺寸 k,找到第一个符合条件的 k,然后返回即可。否则最后返回 1。
48+
4749
<!-- tabs:start -->
4850

4951
### **Python3**
5052

5153
<!-- 这里可写当前语言的特殊实现逻辑 -->
5254

5355
```python
56+
class Solution:
57+
def largestMagicSquare(self, grid: List[List[int]]) -> int:
58+
m, n = len(grid), len(grid[0])
59+
rowsum = [[0] * (n + 1) for _ in range(m + 1)]
60+
colsum = [[0] * (n + 1) for _ in range(m + 1)]
61+
for i in range(1, m + 1):
62+
for j in range(1, n + 1):
63+
rowsum[i][j] = rowsum[i][j - 1] + grid[i - 1][j - 1]
64+
colsum[i][j] = colsum[i - 1][j] + grid[i - 1][j - 1]
65+
66+
def check(x1, y1, x2, y2):
67+
val = rowsum[x1 + 1][y2 + 1] - rowsum[x1 + 1][y1]
68+
for i in range(x1 + 1, x2 + 1):
69+
if rowsum[i + 1][y2 + 1] - rowsum[i + 1][y1] != val:
70+
return False
71+
for j in range(y1, y2 + 1):
72+
if colsum[x2 + 1][j + 1] - colsum[x1][j + 1] != val:
73+
return False
74+
s, i, j = 0, x1, y1
75+
while i <= x2:
76+
s += grid[i][j]
77+
i += 1
78+
j += 1
79+
if s != val:
80+
return False
81+
s, i, j = 0, x1, y2
82+
while i <= x2:
83+
s += grid[i][j]
84+
i += 1
85+
j -= 1
86+
if s != val:
87+
return False
88+
return True
5489

90+
for k in range(min(m, n), 1, -1):
91+
i = 0
92+
while i + k - 1 < m:
93+
j = 0
94+
while j + k - 1 < n:
95+
i2, j2 = i + k - 1, j + k - 1
96+
if check(i, j, i2, j2):
97+
return k
98+
j += 1
99+
i += 1
100+
return 1
55101
```
56102

57103
### **Java**
58104

59105
<!-- 这里可写当前语言的特殊实现逻辑 -->
60106

61107
```java
108+
class Solution {
109+
private int[][] rowsum;
110+
private int[][] colsum;
111+
112+
public int largestMagicSquare(int[][] grid) {
113+
int m = grid.length, n = grid[0].length;
114+
rowsum = new int[m + 1][n + 1];
115+
colsum = new int[m + 1][n + 1];
116+
for (int i = 1; i <= m; ++i) {
117+
for (int j = 1; j <= n; ++j) {
118+
rowsum[i][j] = rowsum[i][j - 1] + grid[i - 1][j - 1];
119+
colsum[i][j] = colsum[i - 1][j] + grid[i - 1][j - 1];
120+
}
121+
}
122+
for (int k = Math.min(m, n); k > 1; --k) {
123+
for (int i = 0; i + k - 1 < m; ++i) {
124+
for (int j = 0; j + k - 1 < n; ++j) {
125+
int i2 = i + k - 1, j2 = j + k - 1;
126+
if (check(grid, i, j, i2, j2)) {
127+
return k;
128+
}
129+
}
130+
}
131+
}
132+
return 1;
133+
}
134+
135+
private boolean check(int[][] grid, int x1, int y1, int x2, int y2) {
136+
int val = rowsum[x1 + 1][y2 + 1] - rowsum[x1 + 1][y1];
137+
for (int i = x1 + 1; i <= x2; ++i) {
138+
if (rowsum[i + 1][y2 + 1] - rowsum[i + 1][y1] != val) {
139+
return false;
140+
}
141+
}
142+
for (int j = y1; j <= y2; ++j) {
143+
if (colsum[x2 + 1][j + 1] - colsum[x1][j + 1] != val) {
144+
return false;
145+
}
146+
}
147+
int s = 0;
148+
for (int i = x1, j = y1; i <= x2; ++i, ++j) {
149+
s += grid[i][j];
150+
}
151+
if (s != val) {
152+
return false;
153+
}
154+
s = 0;
155+
for (int i = x1, j = y2; i <= x2; ++i, --j) {
156+
s += grid[i][j];
157+
}
158+
if (s != val) {
159+
return false;
160+
}
161+
return true;
162+
}
163+
}
164+
```
165+
166+
### **C++**
167+
168+
```cpp
169+
class Solution {
170+
public:
171+
int largestMagicSquare(vector<vector<int>> &grid) {
172+
int m = grid.size(), n = grid.size();
173+
vector<vector<int>> rowsum(m + 1, vector<int>(n + 1));
174+
vector<vector<int>> colsum(m + 1, vector<int>(n + 1));
175+
for (int i = 1; i <= m; ++i)
176+
{
177+
for (int j = 1; j <= n; ++j)
178+
{
179+
rowsum[i][j] = rowsum[i][j - 1] + grid[i - 1][j - 1];
180+
colsum[i][j] = colsum[i - 1][j] + grid[i - 1][j - 1];
181+
}
182+
}
183+
for (int k = min(m, n); k > 1; --k)
184+
{
185+
for (int i = 0; i + k - 1 < m; ++i)
186+
{
187+
for (int j = 0; j + k - 1 < n; ++j)
188+
{
189+
int i2 = i + k - 1, j2 = j + k - 1;
190+
if (check(grid, rowsum, colsum, i, j, i2, j2))
191+
return k;
192+
}
193+
}
194+
}
195+
return 1;
196+
}
197+
198+
bool check(vector<vector<int>> &grid, vector<vector<int>> &rowsum, vector<vector<int>> &colsum, int x1, int y1, int x2, int y2)
199+
{
200+
int val = rowsum[x1 + 1][y2 + 1] - rowsum[x1 + 1][y1];
201+
for (int i = x1 + 1; i <= x2; ++i)
202+
if (rowsum[i + 1][y2 + 1] - rowsum[i + 1][y1] != val)
203+
return false;
204+
for (int j = y1; j <= y2; ++j)
205+
if (colsum[x2 + 1][j + 1] - colsum[x1][j + 1] != val)
206+
return false;
207+
int s = 0;
208+
for (int i = x1, j = y1; i <= x2; ++i, ++j)
209+
s += grid[i][j];
210+
if (s != val)
211+
return false;
212+
s = 0;
213+
for (int i = x1, j = y2; i <= x2; ++i, --j)
214+
s += grid[i][j];
215+
if (s != val)
216+
return false;
217+
return true;
218+
}
219+
};
220+
```
221+
222+
### **Go**
223+
224+
```go
225+
func largestMagicSquare(grid [][]int) int {
226+
m, n := len(grid), len(grid[0])
227+
rowsum := make([][]int, m+1)
228+
colsum := make([][]int, m+1)
229+
for i := 0; i <= m; i++ {
230+
rowsum[i] = make([]int, n+1)
231+
colsum[i] = make([]int, n+1)
232+
}
233+
for i := 1; i < m+1; i++ {
234+
for j := 1; j < n+1; j++ {
235+
rowsum[i][j] = rowsum[i][j-1] + grid[i-1][j-1]
236+
colsum[i][j] = colsum[i-1][j] + grid[i-1][j-1]
237+
}
238+
}
239+
for k := min(m, n); k > 1; k-- {
240+
for i := 0; i+k-1 < m; i++ {
241+
for j := 0; j+k-1 < n; j++ {
242+
i2, j2 := i+k-1, j+k-1
243+
if check(grid, rowsum, colsum, i, j, i2, j2) {
244+
return k
245+
}
246+
}
247+
}
248+
}
249+
return 1
250+
}
251+
252+
func check(grid, rowsum, colsum [][]int, x1, y1, x2, y2 int) bool {
253+
val := rowsum[x1+1][y2+1] - rowsum[x1+1][y1]
254+
for i := x1 + 1; i < x2+1; i++ {
255+
if rowsum[i+1][y2+1]-rowsum[i+1][y1] != val {
256+
return false
257+
}
258+
}
259+
for j := y1; j < y2+1; j++ {
260+
if colsum[x2+1][j+1]-colsum[x1][j+1] != val {
261+
return false
262+
}
263+
}
264+
s := 0
265+
for i, j := x1, y1; i <= x2; i, j = i+1, j+1 {
266+
s += grid[i][j]
267+
}
268+
if s != val {
269+
return false
270+
}
271+
s = 0
272+
for i, j := x1, y2; i <= x2; i, j = i+1, j-1 {
273+
s += grid[i][j]
274+
}
275+
if s != val {
276+
return false
277+
}
278+
return true
279+
}
62280

281+
func min(a, b int) int {
282+
if a > b {
283+
return a
284+
}
285+
return b
286+
}
63287
```
64288

65289
### **...**

0 commit comments

Comments
 (0)