[leetcode]764. Largest Plus Sign
Analysis
2019年还没见过太阳,等一个晴天!!!—— [每天刷题并不难0.0]
In a 2D grid from (0, 0) to (N-1, N-1), every cell contains a 1, except those cells in the given list mines which are 0. What is the largest axis-aligned plus sign of 1s contained in the grid? Return the order of the plus sign. If there is none, return 0.
An “axis-aligned plus sign of 1s of order k” has some center grid[x][y] = 1 along with 4 arms of length k-1 going up, down, left, and right, and made of 1s. This is demonstrated in the diagrams below. Note that there could be 0s or 1s beyond the arms of the plus sign, only the relevant area of the plus sign is checked for 1s.
Explanation:
找到矩阵中最大的加号
Implement
solution 1: (brute force, time complexity: O(N^3))
class Solution {
public:
int orderOfLargestPlusSign(int N, vector<vector<int>>& mines) {
vector<vector<int>> grid(N, vector<int>(N, 1));
for(auto mine:mines){
grid[mine[0]][mine[1]] = 0;
}
int res = 0;
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
int k=0;
while(helper(N, grid, i, j, k))
k++;
res = max(res, k);
}
}
return res;
}
bool helper(int N, vector<vector<int>>& grid, int i, int j, int k){
if(i-k>=0 && i+k<N && j-k>=0 && j+k<N)
return grid[i-k][j] && grid[i+k][j] && grid[i][j-k] && grid[i][j+k];
return false;
}
};
solution 2 (time complexity: O(N^2))
这个方法是事先计算出每个点上下左右连续的1的个数~
class Solution {
public:
int orderOfLargestPlusSign(int N, vector<vector<int>>& mines) {
vector<vector<int>> dp(N, vector<int>(N, N));
int res = 0;
for(auto mine:mines)
dp[mine[0]][mine[1]] = 0;
for(int i=0; i<N; i++){
int l=0, r=0, u=0, d=0;
for(int j=0, k=N-1; j<N; j++, k--){
dp[i][j] = min(dp[i][j], l=(dp[i][j]==0?0:l+1));
dp[i][k] = min(dp[i][k], r=(dp[i][k]==0?0:r+1));
dp[j][i] = min(dp[j][i], u=(dp[j][i]==0?0:u+1));
dp[k][i] = min(dp[k][i], d=(dp[k][i]==0?0:d+1));
}
}
for(int i=0; i<N; i++){
for(int j=0; j<N; j++)
res = max(res, dp[i][j]);
}
return res;
}
};