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和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关推荐
Run_Teenage2 分钟前
算法:离散化模板
算法
乐迪信息2 分钟前
乐迪信息:实时预警,秒级响应:船舶AI异常行为检测算法
大数据·人工智能·算法·安全·目标跟踪
6Hzlia4 分钟前
【Hot 100 刷题计划】 LeetCode 15. 三数之和 | C++ 排序+双指针
c++·算法·leetcode
fox_lht7 分钟前
第十章 通用集合
开发语言·后端·算法·rust
新新学长搞科研15 分钟前
【高质量能源会议推荐】第十一届能源与环境研究进展国际学术会议(ICAEER 2026)
人工智能·物联网·算法·机器学习·能源·环境·新能源
CN-Dust26 分钟前
【C++】for循环例题专题
java·c++·算法
楼兰公子1 小时前
读取rpi摄像头
linux·服务器·算法
渡之1 小时前
NaviLoc - GNSS 拒止环境下无人机空对地卫星视觉定位算法 论文整理
算法·无人机·飞控
leo__5201 小时前
单载波中继系统资源分配算法MATLAB仿真程序
算法·matlab·unity
故事和你911 小时前
洛谷-算法2-3-分治与倍增5
开发语言·数据结构·c++·算法·动态规划·图论