A.每日一题——2536. 子矩阵元素加 1

题目链接:2536. 子矩阵元素加 1(中等)

算法原理:

解法:前缀和+二维差分数组

击败74.85%

时间复杂度O(N²)

一维和二维的差分数组笔记如下👇

差分算法演示动画(博主就是在这里学习到的🌹)

Java代码:

java 复制代码
/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 王洋
 * Date: 2025-11-14
 * Time: 10:58
 */
class Solution {
    //2536. 子矩阵元素加 1
    //自己第一次的正确但超时的代码
    public int[][] rangeAddQueries(int n, int[][] queries) {
        int[][] ret=new int[n][n];
        for(int k=0;k<queries.length;k++){
            int x1=queries[k][0],y1=queries[k][1],
                    x2=queries[k][2],y2=queries[k][3];
            for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                    if(x1<=i&&i<=x2&&y1<=j&&j<=y2)
                        ret[i][j]++;
        }
        return ret;
    }

    //研究了三四个小时,新学到了前缀和算法中的差分数组算法
    //第一个for循环可以换成for-each循环,一样的
    public int[][] rangeAddQueries2(int n, int[][] queries) {
        int[][] diff=new int[n+1][n+1];
        for(int k=0;k<queries.length;k++){
            int x1=queries[k][0],y1=queries[k][1],
                    x2=queries[k][2],y2=queries[k][3];
            diff[x1][y1]+=1;
            diff[x2+1][y2+1]+=1;
            diff[x1][y2+1]-=1;
            diff[x2+1][y1]-=1;
        }
        int[][] mat=new int[n][n];
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                //计算三个区域的前缀和
                int k1=(i==0?0:mat[i-1][j]);//计算(A+B区域)
                int k2=(j==0?0:mat[i][j-1]);//计算(A+C区域)
                int k3=(i==0||j==0)?0:mat[i-1][j-1];//计算A区域
                mat[i][j]=diff[i][j]+k1+k2-k3;
            }
        }
        return mat;
    }
}
相关推荐
不可描述的两脚兽2 小时前
Redis 快记
java·数据库·redis
普通网友2 小时前
C++与Qt图形开发
开发语言·c++·算法
KG_LLM图谱增强大模型2 小时前
Vgent:基于图的多模态检索推理增强生成框架GraphRAG,突破长视频理解瓶颈
大数据·人工智能·算法·大模型·知识图谱·多模态
普通网友2 小时前
C++中的适配器模式
开发语言·c++·算法
Felix_XXXXL3 小时前
mysql查看binlog日志
java·后端
leonardee3 小时前
Plugin ‘mysql_native_password‘ is not loaded`
java·后端
普通网友3 小时前
C++中的委托构造函数
开发语言·c++·算法
珹洺3 小时前
Java-Spring入门指南(三十一)Android意图(Intent)
android·java·spring
Seven973 小时前
剑指offer-39、平衡⼆叉树
java