LeetCode 最大加号标志(图解)

版权声明:本文为博主原创文章,博客地址:https://blog.csdn.net/qq_41855420,未经博主允许不得转载。 https://blog.csdn.net/qq_41855420/article/details/89851636
描述:

在一个大小在 (0, 0) 到 (N-1, N-1) 的2D网格 grid 中,除了在 mines 中给出的单元为 0,其他每个单元都是 1。网格中包含 1 的最大的轴对齐加号标志是多少阶?返回加号标志的阶数。如果未找到加号标志,则返回 0。

一个 k" 阶由 1 组成的“轴对称”加号标志具有中心网格 grid[x][y] = 1 ,以及4个从中心向上、向下、向左、向右延伸,长度为 k-1,由 1 组成的臂。下面给出 k" 阶“轴对称”加号标志的示例。注意,只有加号标志的所有网格要求为 1,别的网格可能为 0 也可能为 1。

k 阶轴对称加号标志示例:

阶 1:
000
010
000
阶 2:
00000
00100
01110
00100
00000
阶 3:
0000000
0001000
0001000
0111110
0001000
0001000
0000000
示例 1:
输入: N = 5, mines = [[4, 2]]
输出: 2
解释:
11111
11111
11111
11111
11011
在上面的网格中,最大加号标志的阶只能是2。一个标志已在图中标出。
示例 2:
输入: N = 2, mines = []
输出: 1
解释:
11
11
没有 2 阶加号标志,有 1 阶加号标志。
示例 3:
输入: N = 1, mines = [[0, 0]]
输出: 0
解释:
0
没有加号标志,返回 0 。
提示:
整数N 的范围: [1, 500].
mines 的最大长度为 5000.
mines[i] 是长度为2的由2个 [0, N-1] 中的数组成.
(另外,使用 C, C++, 或者 C# 编程将以稍小的时间限制进行​​判断.)

\color{blue}{思路分析:} 这道题我们采取递推扫描的方式确认每个点的上下左右方向的延伸数,然后取最小值,就是中间这个点的阶数,然后取所有点的最大值即可。

class Solution {
public:
    int orderOfLargestPlusSign(int N, vector<vector<int>>& mines) {
        vector<vector<int>> grid(N, vector<int>(N, N));//初始化所有点都为N
        for (auto &mine : mines){//去除黑名单
            grid[mine[0]][mine[1]] = 0;
        }
        for (int k = 0; k < N; ++k){//k代表第k行,第k列
            int leftOne = 0, rightOne = 0, upOne = 0, downOne = 0;//分别代表上下左右四个方向连续的连续非0的个数
            for (int i = 0, j = N - 1; i < N; ++i, --j){
                //第k行的左边扫描
                leftOne = (grid[k][i] == 0 ? 0 : leftOne + 1);
                grid[k][i] = min(grid[k][i], leftOne);
                //第k行的右边扫描
                rightOne = (grid[k][j] == 0 ? 0 : rightOne + 1);
                grid[k][j] = min(grid[k][j], rightOne);
                //第k列的上边扫描
                upOne = (grid[i][k] == 0 ? 0 : upOne + 1);
                grid[i][k] = min(grid[i][k], upOne);
                //第k列的下边扫描
                downOne = (grid[j][k] == 0 ? 0 : downOne + 1);
                grid[j][k] = min(grid[j][k], downOne);
            }
        }
        //最后寻找最大值
        int maxRes = 0;
        for (int i = 0; i < N; ++i){
            for (int j = 0; j < N; ++j){
                maxRes = max(maxRes, grid[i][j]);
            }
        }
        return maxRes;
    }
};

在这里插入图片描述
中间的for循环可能有点难以理解,有图有真相。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41855420/article/details/89851636
今日推荐