leetcode 2536

2536: 子矩阵元素加1

思路1:暴力解

复制代码
class Solution {
public:
    vector<vector<int>> rangeAddQueries(int n, vector<vector<int>>& queries) {
        vector<vector<int>> ans(n,vector<int>(n,0));
        for(auto& qur :queries){
            for(int i=qur[0];i<=qur[2];i++){
                for(int j=qur[1];j<=qur[3];j++){
                    ans[i][j]++;
                }
            }
        }

        return ans;
    }
};

思路2:二维差分+二维前缀和

一维差分,见 leetcode 2528

使用二维差分数组diff,其中diffij表示原数组matij到matn-1n-1每个元素++变化值。++

例如将matx1y1到matx2y2每个元素值加一,反映到差分数组上就表现为:

diffx1y1+=1,先从matx1y1到matn-1n-1每个元素都加一

diffx2+1y1−=1,由于从matx2+1y1到matn-1n-1每个元素无需改变,第一步加的范围太大了,不该变的撤销变化

diffx1y2+1−=1,与2同理,由于从matx1y2+1到matn-1n-1每个元素无需改变,第一步加的范围太大了,不该变的撤销变化

diffx2+1y2+1+=1,由于第二步和第三步都包含范围matx2+1y2+1,所以这块"重复撤销"了,再加回来

对于每个query,以O(1)的时间复杂度可以计算出diff数组的变化。最终处理完所有query,再由diff差分数组反推出原数组mat就好了。

代码实现时,为方便计算二维前缀和,可以在二维差分矩阵最上面添加一行 0,最左边添加一列 0,这样计算二维前缀和无需考虑下标越界。

  • 公式
    diff[i][j] = diff[i][j] + diff[i-1][j] + diff[i][j-1] - diff[i-1][j-1]

    正是二维前缀和递推式。

    class Solution {
    public:
    vector<vector> rangeAddQueries(int n, vector<vector>& queries) {
    /*二维差分,记录差分数组的变化
    二维矩阵a的区域+1操作,等价于更新差分矩阵d中4个位置的差分值。
    为方便计算二维前缀和,在二维差分矩阵上下左右各添加一行0 */
    vector<vector> diff(n+2,vector(n+2)); //防止越界
    for(auto& q :queries){
    int r1=q[0],c1=q[1],r2=q[2],c2=q[3];
    diff[r1+1][c1+1]++;
    diff[r1+1][c2+2]--;
    diff[r2+2][c1+1]--;
    diff[r2+2][c2+2]++;
    }

    复制代码
          // 原地计算 diff 的二维前缀和,然后填入答案
          vector<vector<int>> ans(n,vector<int>(n));
          for(int i=0;i<n;i++){
              for(int j=0;j<n;j++){  
                  diff[i+1][j+1]+=diff[i][j+1]+diff[i+1][j]-diff[i][j];
                  ans[i][j]=diff[i+1][j+1];
              }
          }
    
          return ans;
      }

    };

相关推荐
不会代码的小猴11 分钟前
3. 控件学习1
开发语言·c++·笔记·qt·算法
疯狂打码的少年2 小时前
【数据结构】图的存储结构:邻接矩阵与邻接表
数据结构·笔记
203号居民2 小时前
LeetCode hot 100 —41. 缺失的第一个正数
数据结构·算法·leetcode
专注仿真4 小时前
问答大模型技术方案算法实现-熵权法融合算法 + 交叉编码器重排算法
人工智能·python·算法·语言模型·问答大模型关键算法·熵权融合算法·交叉编码器重排算法
地平线开发者5 小时前
量化为什么会有损失:从量化误差到精度下降
算法
手写码匠6 小时前
华为云Flexus+DeepSeek征文|Dify 多 Agent 会话管理与上下文工程实战:让智能体“记住该记住的,忘掉该忘掉的“
人工智能·深度学习·算法·aigc
2401_862880826 小时前
数据结构 --- 栈
c语言·数据结构·算法
致Great6 小时前
Qwen3.8-27B 接入 DSH 全流程实测:写代码、跑长任务,都没问题
算法
Tisfy7 小时前
LeetCode 3471.找出最大的几近缺失整数:三种情况判断
算法·leetcode·题解·分类讨论
linux-hzh7 小时前
百日算法修炼 · Day 12
算法·深度优先