A k x kmagic square is a k x k grid filled with integers such that every row sum, every column sum, and both diagonal sums are all equal. The integers in the magic square do not have to be distinct. Every 1 x 1
grid is trivially a magic square.
Given an m x n integer grid, return _thesize (i.e., the side length _k) of thelargest magic square that can be found within this grid.

Input: grid =[[7,1,4,5,6],[2,5,1,6,4],[1,5,4,3,2],[1,2,7,3,4]]Output: 3Explanation: The largest magic square has a size of 3.Every row sum, column sum, and diagonal sum of this magic square is equal to 12.- Row sums:5+1+6=5+4+3=2+7+3=12- Column sums:5+5+2=1+4+7=6+3+3=12- Diagonal sums:5+4+3=6+4+2=12
A magic square requires all rows, columns, and both diagonals to have the same sum. We can use prefix sums to quickly compute row and column sums for any sub-square, and then check all possible k x k squares from largest to smallest.
classSolution {
public:int largestMagicSquare(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
vector<vector<int>> row(m, vector<int>(n+1)), col(m+1, vector<int>(n));
for (int i =0; i < m; ++i)
for (int j =0; j < n; ++j) {
row[i][j+1] = row[i][j] + grid[i][j];
col[i+1][j] = col[i][j] + grid[i][j];
}
for (int k = min(m, n); k >=1; --k) {
for (int i =0; i <= m-k; ++i) {
for (int j =0; j <= n-k; ++j) {
int sum = row[i][j+k] - row[i][j];
bool ok = true;
for (int x =0; x < k; ++x) {
if (row[i+x][j+k] - row[i+x][j] != sum) ok = false;
if (col[i+k][j+x] - col[i][j+x] != sum) ok = false;
}
int d1 =0, d2 =0;
for (int x =0; x < k; ++x) {
d1 += grid[i+x][j+x];
d2 += grid[i+x][j+k-1-x];
}
if (d1 != sum || d2 != sum) ok = false;
if (ok) return k;
}
}
}
return1;
}
};
classSolution {
publicintlargestMagicSquare(int[][] grid) {
int m = grid.length, n = grid[0].length;
int[][] row =newint[m][n+1], col =newint[m+1][n];
for (int i = 0; i < m; ++i)
for (int j = 0; j < n; ++j) {
row[i][j+1]= row[i][j]+ grid[i][j];
col[i+1][j]= col[i][j]+ grid[i][j];
}
for (int k = Math.min(m, n); k >= 1; --k) {
for (int i = 0; i <= m-k; ++i) {
for (int j = 0; j <= n-k; ++j) {
int sum = row[i][j+k]- row[i][j];
boolean ok =true;
for (int x = 0; x < k; ++x) {
if (row[i+x][j+k]- row[i+x][j]!= sum) ok =false;
if (col[i+k][j+x]- col[i][j+x]!= sum) ok =false;
}
int d1 = 0, d2 = 0;
for (int x = 0; x < k; ++x) {
d1 += grid[i+x][j+x];
d2 += grid[i+x][j+k-1-x];
}
if (d1 != sum || d2 != sum) ok =false;
if (ok) return k;
}
}
}
return 1;
}
}
classSolution {
funlargestMagicSquare(grid: Array<IntArray>): Int {
val m = grid.size
val n = grid[0].size
val row = Array(m) { IntArray(n+1) }
val col = Array(m+1) { IntArray(n) }
for (i in0 until m)
for (j in0 until n) {
row[i][j+1] = row[i][j] + grid[i][j]
col[i+1][j] = col[i][j] + grid[i][j]
}
for (k in minOf(m, n) downTo 1) {
for (i in0..m-k) {
for (j in0..n-k) {
val sum = row[i][j+k] - row[i][j]
var ok = truefor (x in0 until k) {
if (row[i+x][j+k] - row[i+x][j] != sum) ok = falseif (col[i+k][j+x] - col[i][j+x] != sum) ok = false }
var d1 = 0; var d2 = 0for (x in0 until k) {
d1 += grid[i+x][j+x]
d2 += grid[i+x][j+k-1-x]
}
if (d1 != sum || d2 != sum) ok = falseif (ok) return k
}
}
}
return1 }
}
classSolution:
deflargestMagicSquare(self, grid: list[list[int]]) -> int:
m, n = len(grid), len(grid[0])
row = [[0]*(n+1) for _ in range(m)]
col = [[0]*n for _ in range(m+1)]
for i in range(m):
for j in range(n):
row[i][j+1] = row[i][j] + grid[i][j]
col[i+1][j] = col[i][j] + grid[i][j]
for k in range(min(m, n), 0, -1):
for i in range(m-k+1):
for j in range(n-k+1):
s = row[i][j+k] - row[i][j]
ok =Truefor x in range(k):
if row[i+x][j+k] - row[i+x][j] != s: ok =Falseif col[i+k][j+x] - col[i][j+x] != s: ok =False d1 = d2 =0for x in range(k):
d1 += grid[i+x][j+x]
d2 += grid[i+x][j+k-1-x]
if d1 != s or d2 != s: ok =Falseif ok: return k
return1
impl Solution {
pubfnlargest_magic_square(grid: Vec<Vec<i32>>) -> i32 {
let m = grid.len();
let n = grid[0].len();
letmut row =vec![vec![0; n+1]; m];
letmut col =vec![vec![0; n]; m+1];
for i in0..m {
for j in0..n {
row[i][j+1] = row[i][j] + grid[i][j];
col[i+1][j] = col[i][j] + grid[i][j];
}
}
for k in (1..=m.min(n)).rev() {
for i in0..=m-k {
for j in0..=n-k {
let sum = row[i][j+k] - row[i][j];
letmut ok =true;
for x in0..k {
if row[i+x][j+k] - row[i+x][j] != sum { ok =false; }
if col[i+k][j+x] - col[i][j+x] != sum { ok =false; }
}
let (mut d1, mut d2) = (0, 0);
for x in0..k {
d1 += grid[i+x][j+x];
d2 += grid[i+x][j+k-1-x];
}
if d1 != sum || d2 != sum { ok =false; }
if ok { return k asi32; }
}
}
}
1 }
}