思路:
首先使用dp计算出在每个位置(i, j)上下左右最多有多少个连续的1,得到up[i][j], down[i][j], left[i][j], right[i][j]。然后计算这四个值中的最小值,所有最小值中的最大值就是答案。
实现:
1 class Solution 2 { 3 public: 4 int orderOfLargestPlusSign(int N, vector<vector<int>>& mines) 5 { 6 vector<vector<int>> left(N, vector<int>(N, 0)), right(N, vector<int>(N, 0)); 7 vector<vector<int>> up(N, vector<int>(N, 0)), down(N, vector<int>(N, 0)); 8 vector<vector<int>> a(N, vector<int>(N, 1)); 9 for (int i = 0; i < mines.size(); i++) 10 a[mines[i][0]][mines[i][1]] = 0; 11 for (int i = 0; i < N; i++) 12 { 13 left[i][0] = (a[i][0] == 1 ? 1 : 0); 14 right[i][N - 1] = (a[i][N - 1] == 1 ? 1 : 0); 15 for (int j = 1; j < N; j++) 16 { 17 left[i][j] = a[i][j] == 0 ? 0 : left[i][j - 1] + 1; 18 right[i][N - 1 - j] = a[i][N - 1 - j] == 0 ? 0 : right[i][N - j] + 1; 19 } 20 } 21 for (int j = 0; j < N; j++) 22 { 23 up[0][j] = (a[0][j] == 1 ? 1 : 0); 24 down[N - 1][j] = (a[N - 1][j] == 1 ? 1 : 0); 25 for (int i = 1; i < N; i++) 26 { 27 up[i][j] = a[i][j] == 0 ? 0 : up[i - 1][j] + 1; 28 down[N - 1 - i][j] = a[N - 1 - i][j] == 0 ? 0 : down[N - i][j] + 1; 29 } 30 } 31 int maxn = 0; 32 for (int i = 0; i < N; i++) 33 { 34 for (int j = 0; j < N; j++) 35 { 36 int tmp = min(min(min(up[i][j], down[i][j]), left[i][j]), right[i][j]); 37 maxn = max(maxn, tmp); 38 } 39 } 40 return maxn; 41 } 42 };