leetcode764 Largest Plus Sign

思路:

首先使用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 };
原文地址:https://www.cnblogs.com/wangyiming/p/8658120.html