LeetCode 3212.统计 X 和 Y 频数相等的子矩阵数量:前缀和

【LetMeFly】3212.统计 X 和 Y 频数相等的子矩阵数量:前缀和

力扣题目链接:https://leetcode.cn/problems/count-submatrices-with-equal-frequency-of-x-and-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''.'.

解题方法:前缀和

类似昨天的每日一题3070.元素和小于等于 k 的子矩阵的数目,使用一个 d i f f diff diff数组存储从 ( 0 , 0 ) (0,0) (0,0)到 ( i , j ) (i,j) (i,j)的X - Y的数量,再额外使用一个数组存储从 ( 0 , 0 ) (0,0) (0,0)到 ( i , j ) (i,j) (i,j)是否存在X(或Y)。

遍历过程中维护并更新这两个数组即可。

  • 时间复杂度 O ( m n ) O(mn) O(mn)
  • 空间复杂度 O ( m n ) O(mn) O(mn)

AC代码

C++
cpp 复制代码
/*
 * @LastEditTime: 2026-03-19 22:19:31
 */
class Solution {
private:
    inline int v(int x) {
        return x == 'X' ? 1 : x == 'Y' ? -1 : 0;
    }
public:
    int numberOfSubmatrices(vector<vector<char>>& grid) {
        int ans = 0;
        int n = grid.size(), m = grid[0].size();
        vector<vector<bool>> hasX(n, vector<bool>(m));  // has x or y
        vector<vector<int>> diff(n, vector<int>(m));
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (i && j) {
                    hasX[i][j] = hasX[i - 1][j] | hasX[i][j - 1] | (grid[i][j] != '.');
                    diff[i][j] = diff[i - 1][j] + diff[i][j - 1] - diff[i - 1][j - 1] + v(grid[i][j]);
                } else if (i) {
                    hasX[i][j] = hasX[i - 1][j] | (grid[i][j] != '.');
                    diff[i][j] = diff[i - 1][j] + v(grid[i][j]);
                } else if (j) {
                    hasX[i][j] = hasX[i][j - 1] | (grid[i][j] != '.');
                    diff[i][j] = diff[i][j - 1] + v(grid[i][j]);
                } else {
                    hasX[i][j] = grid[i][j] != '.';
                    diff[i][j] = v(grid[i][j]);
                }
                ans += (!diff[i][j] && hasX[i][j]);
            }
        }
        return ans;
    }
};

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关推荐
木木子2210 小时前
# 密码强度检测深度解析:正则表达式实时分析、多维度评分算法与可视化反馈
mysql·算法·华为·正则表达式·harmonyos
Sw1zzle13 小时前
算法入门(四):二叉树 - 递归遍历三件套
算法·leetcode
万法若空13 小时前
【算法-查找】查找算法
java·数据结构·算法
海石13 小时前
子树怎么找?树的3种遍历方式来帮忙!
算法·leetcode
海石13 小时前
难度分 1588:思路 + 技巧 = AC
算法·leetcode
珠海西格电力17 小时前
云边端协同架构:零碳园区管理系统的技术底座
大数据·运维·人工智能·算法·架构·能源
还有多久拿退休金19 小时前
让飞书知识库跟着 commit 自己长:一套自动化知识库的真实实现
前端·算法·架构
KaMeidebaby20 小时前
卡梅德生物技术快报|小 RNA 适配体合成 + 多方法亲和力表征全流程标准化操作手册
前端·网络·数据库·人工智能·算法
是Dream呀20 小时前
基于深度学习的人类行为识别算法研究
人工智能·深度学习·算法
happyprince21 小时前
03_NVIDIA_ModelOpt-量化算法深入
人工智能·深度学习·算法