• LeetCode764,每日一题20221109,最大加号标志


    题目

    给1个n*n01矩阵,求由1构成的最大的+号,+号大小等于最小的边长,如
    0 0 1 1 0 1 1 1 0 0 0 1

    001101\bold110001" role="presentation">001101\bold110001
    000010110111 的大小是1, 0 0 1 1 0 1 1 1 0 0 1 1
    00\bold110\bold1\bold1\bold100\bold11" role="presentation">00\bold110\bold1\bold1\bold100\bold11
    000010111111
    的大小是2。

    题解

    思路

    1. 计算每一个位置的答案;
    2. 计算每个位置左右上下的连续的1的个数(包含本身),答案四个数中是最小的;
    3. 所有答案取最大值即可。

    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;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
  • 相关阅读:
    UE5 ChaosVehicles载具 实现大漂移 (连载四)
    java 生成 pdf,支持中文显示
    Vue3.3 新特性 - 初体验
    springboot基础(31):Mongodb的基本操作
    【nginx】nginx部署升级htpp+websocket访问
    Python 中 staticmethod 和 classmethod 原理
    HUST-OJ运用经验
    漏刻有时数据可视化大屏(16)数据指标KPI和柱图折线图混排
    23111704[含文档+PPT+源码等]计算机毕业设计springboot办公管理系统oa人力人事办公
    HP OfficeJet Pro 8020 如何更换碳粉盒
  • 原文地址:https://blog.csdn.net/YJEthan/article/details/127775716