class Solution:
def getBiggestThree(self, grid):
import heapq
m, n = len(grid), len(grid[0])
res = set()
for i in range(m):
for j in range(n):
res.add(grid[i][j])
max_len = min(i, m - 1 - i, j, n - 1 - j)
for l in range(1, max_len + 1):
s = 0
x, y = i - l, j
for k in range(l):
s += grid[x + k][y + k]
x, y = i, j + l
for k in range(l):
s += grid[x + k][y - k]
x, y = i + l, j
for k in range(l):
s += grid[x - k][y - k]
x, y = i, j - l
for k in range(l):
s += grid[x - k][y + k]
s -= grid[i - l][j]
s -= grid[i][j + l]
s -= grid[i + l][j]
s -= grid[i][j - l]
res.add(s)
return sorted(res, reverse=True)[:3]
class Solution {
public:
vector<int> getBiggestThree(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
set<int> res;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
res.insert(grid[i][j]);
int max_len = min({i, m - 1 - i, j, n - 1 - j});
for (int l = 1; l <= max_len; ++l) {
int s = 0;
int x = i - l, y = j;
for (int k = 0; k < l; ++k)
s += grid[x + k][y + k];
x = i, y = j + l;
for (int k = 0; k < l; ++k)
s += grid[x + k][y - k];
x = i + l, y = j;
for (int k = 0; k < l; ++k)
s += grid[x - k][y - k];
x = i, y = j - l;
for (int k = 0; k < l; ++k)
s += grid[x - k][y + k];
s -= grid[i - l][j];
s -= grid[i][j + l];
s -= grid[i + l][j];
s -= grid[i][j - l];
res.insert(s);
}
}
}
vector<int> ans;
for (auto it = res.rbegin(); it != res.rend() && ans.size() < 3; ++it)
ans.push_back(*it);
return ans;
}
};
class Solution {
public int[] getBiggestThree(int[][] grid) {
int m = grid.length, n = grid[0].length;
TreeSet<Integer> res = new TreeSet<>();
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
res.add(grid[i][j]);
int max_len = Math.min(Math.min(i, m - 1 - i), Math.min(j, n - 1 - j));
for (int l = 1; l <= max_len; ++l) {
int s = 0;
int x = i - l, y = j;
for (int k = 0; k < l; ++k)
s += grid[x + k][y + k];
x = i; y = j + l;
for (int k = 0; k < l; ++k)
s += grid[x + k][y - k];
x = i + l; y = j;
for (int k = 0; k < l; ++k)
s += grid[x - k][y - k];
x = i; y = j - l;
for (int k = 0; k < l; ++k)
s += grid[x - k][y + k];
s -= grid[i - l][j];
s -= grid[i][j + l];
s -= grid[i + l][j];
s -= grid[i][j - l];
res.add(s);
}
}
}
int[] ans = new int[Math.min(3, res.size())];
int idx = 0;
for (Integer v : res.descendingSet()) {
if (idx == 3) break;
ans[idx++] = v;
}
return ans;
}
}
var getBiggestThree = function(grid) {
const m = grid.length, n = grid[0].length;
const res = new Set();
for (let i = 0; i < m; ++i) {
for (let j = 0; j < n; ++j) {
res.add(grid[i][j]);
let max_len = Math.min(i, m - 1 - i, j, n - 1 - j);
for (let l = 1; l <= max_len; ++l) {
let s = 0;
let x = i - l, y = j;
for (let k = 0; k < l; ++k)
s += grid[x + k][y + k];
x = i; y = j + l;
for (let k = 0; k < l; ++k)
s += grid[x + k][y - k];
x = i + l; y = j;
for (let k = 0; k < l; ++k)
s += grid[x - k][y - k];
x = i; y = j - l;
for (let k = 0; k < l; ++k)
s += grid[x - k][y + k];
s -= grid[i - l][j];
s -= grid[i][j + l];
s -= grid[i + l][j];
s -= grid[i][j - l];
res.add(s);
}
}
}
return Array.from(res).sort((a, b) => b - a).slice(0, 3);
};