leetcode 3212. 统计 X 和 Y 频数相等的子矩阵数量 中等

给你一个二维字符矩阵 grid,其中 grid[i][j] 可能是 'X''Y''.',返回满足以下条件的子矩阵数量:

  • 包含 grid[0][0]
  • 'X''Y' 的频数相等。
  • 至少包含一个 'X'

示例 1:

输入: grid = [["X","Y","."],["Y",".","."]]

输出: 3

解释:

示例 2:

输入: grid = [["X","X"],["X","Y"]]

输出: 0

解释:

不存在满足 'X''Y' 频数相等的子矩阵。

示例 3:

输入: grid = [[".","."],[".","."]]

输出: 0

解释:

不存在满足至少包含一个 'X' 的子矩阵。

提示:

  • 1 <= grid.length, grid[i].length <= 1000
  • grid[i][j] 可能是 'X''Y''.'.

分析:二维前缀和。用一个数组记录以当前位置为右下角的矩阵中,包含的 X 和 Y 的数量,当这两个值先等且不为 0 时,说明这个子矩阵符合要求。检查所有点,统计符合要求的点的数量。

cpp 复制代码
typedef struct node
{
    int x,y;
}node;
int numberOfSubmatrices(char** grid, int gridSize, int* gridColSize) {
    int n=gridSize,m=gridColSize[0];
    node cnt[n+5][m+5];cnt[0][0].x=cnt[0][0].y=0;
    if(grid[0][0]=='X')cnt[0][0].x=1;
    else if(grid[0][0]=='Y')cnt[0][0].y=1;
    for(int i=1;i<n;++i)
    {
        cnt[i][0]=cnt[i-1][0];
        // cnt[i][0].x=cnt[i-1][0].x,cnt[i][0].y=cnt[i-1][0].y;
        if(grid[i][0]=='X')cnt[i][0].x+=1;
        else if(grid[i][0]=='Y')cnt[i][0].y+=1;
    }
    for(int j=1;j<m;++j)
    {
        cnt[0][j]=cnt[0][j-1];
        // cnt[0][j].x=cnt[0][j].x,cnt[0][j-1].y=cnt[0][j-1].y;
        if(grid[0][j]=='X')cnt[0][j].x+=1;
        else if(grid[0][j]=='Y')cnt[0][j].y+=1;
    }
    for(int i=1;i<n;++i)
        for(int j=1;j<m;++j)
        {
            cnt[i][j].x=cnt[i-1][j].x+cnt[i][j-1].x-cnt[i-1][j-1].x;
            cnt[i][j].y=cnt[i-1][j].y+cnt[i][j-1].y-cnt[i-1][j-1].y;
            if(grid[i][j]=='X')cnt[i][j].x+=1;
            else if(grid[i][j]=='Y')cnt[i][j].y+=1;
        }
    int ans=0;
    for(int i=0;i<n;++i)
        for(int j=0;j<m;++j)
            if(cnt[i][j].x&&cnt[i][j].x==cnt[i][j].y)
                ans++;
    return ans;
}
相关推荐
_深海凉_3 小时前
LeetCode热题100-寻找两个正序数组的中位数
算法·leetcode·职场和发展
踩坑记录3 小时前
leetcode hot100 寻找两个正序数组的中位数 hard 二分查找 双指针
leetcode
superior tigre6 小时前
78 子集
算法·leetcode·深度优先·回溯
superior tigre8 小时前
739 每日温度
算法·leetcode·职场和发展
6Hzlia8 小时前
【Hot 100 刷题计划】 LeetCode 15. 三数之和 | C++ 排序+双指针
c++·算法·leetcode
北顾笙98010 小时前
day37-数据结构力扣
数据结构·算法·leetcode
6Hzlia12 小时前
【Hot 100 刷题计划】 LeetCode 189. 轮转数组 | C++ 三次反转经典魔法 (O(1) 空间)
c++·算法·leetcode
m0_6294947313 小时前
LeetCode 热题 100-----13.最大子数组和
数据结构·算法·leetcode
田梓燊13 小时前
力扣:94.二叉树的中序遍历
数据结构·算法·leetcode
khalil102013 小时前
代码随想录算法训练营Day-38动态规划06 | 322. 零钱兑换、279.完全平方数、139.单词拆分、多重背包、总结
数据结构·c++·算法·leetcode·动态规划