给1个n*n
的01
矩阵,求由1构成的最大的+
号,+
号大小等于最小的边长,如
0
0
1
1
0
1
1
1
0
0
0
1
tips: 枚举四个方向的时候,可以抽象出来,用一个函数处理。
O(n^2)
O(4*n^2)
四个方向的长度。
class Solution {
public:
void calLine(int startx, int starty, int stepx, int stepy, int len, vector<vector<vector<int> > >& flag, int pos, vector<vector<int> >& matrix) {
for(int i = 0; i < len; i++) {
if(i) {
flag[pos][startx][starty] = flag[pos][startx - stepx][starty - stepy];
}
flag[pos][startx][starty] += matrix[startx][starty];
if(matrix[startx][starty] == 0) flag[pos][startx][starty] = 0;
startx += stepx;
starty += stepy;
}
}
int orderOfLargestPlusSign(int n, vector<vector<int>>& mines) {
vector<vector<int>> matrix(n, vector<int>(n, 1));
vector<vector<vector<int>>> flag(4, vector<vector<int>>(n, vector<int>(n, 0)));
for(auto mine : mines) {
matrix[mine[0]][mine[1]] = 0;
}
for(int i = 0; i < n; i++) {
calLine(i, 0, 0, 1, n, flag, 0, matrix);
calLine(i, n - 1, 0, -1, n, flag, 1, matrix);
calLine(0, i, 1, 0, n, flag, 2, matrix);
calLine(n - 1, i, -1, 0, n, flag, 3, matrix);
}
int ans = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
// for(int k = 0; k < 4; k++) {
// cout << i << " " << j << " " << k << " " << flag[k][i][j] << endl;
// }
// flag[3][3][3];
ans = max(ans, min(min(flag[0][i][j], flag[1][i][j]), min(flag[2][i][j], flag[3][i][j])));
}
}
return ans;
}
};