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

千篇源码题解已开源

相关推荐
hetao17338372 分钟前
校内场-提高组 ZYZSC-S-Round 4
c++·算法
彧azz29 分钟前
二叉搜索树学习记录
c语言·数据结构·笔记·算法
手写码匠1 小时前
DeepSeek 函数调用实战:从零搭建一个会“动手“的 AI 助手
人工智能·深度学习·算法·aigc
果壳science2 小时前
《自然本源》如何实现狭义相对论的代数化
笔记·算法·几何学
302wanger3 小时前
分享一个工作习惯:整点看即时消息
算法
洋不写bug4 小时前
排序(一)基础排序,插入|希尔|冒泡|直接选择排序详解
java·算法·排序算法·插入排序·冒泡排序·希尔排序·直接选择排序
牧羊人.3334 小时前
动手学深度学习 03 | 卷积神经网络实现手写数字识别
人工智能·深度学习·神经网络·算法·cnn
AgentMaster5 小时前
数据治理工具选型指南:一套可复用的四阶段决策框架
大数据·数据结构·人工智能·算法
liliangcsdn5 小时前
最终留出样本/样本外测试集-holdout解读
算法
爱敲代码的小黄5 小时前
机器学习入门:从数据、训练到业务决策
算法