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;
    }
}
相关推荐
小冷coding2 分钟前
【Java】Dubbo 与 OpenFeign 的核心区别
java·开发语言·dubbo
Coder_Boy_6 分钟前
基于SpringAI的在线考试系统-智能考试系统-学习分析模块
java·开发语言·数据库·spring boot·ddd·tdd
2401_8948281219 分钟前
从原理到实战:随机森林算法全解析(附 Python 完整代码)
开发语言·python·算法·随机森林
cdut_suye21 分钟前
解锁函数的魔力:Python 中的多值传递、灵活参数与无名之美
java·数据库·c++·人工智能·python·机器学习·热榜
Remember_99331 分钟前
【LeetCode精选算法】前缀和专题二
算法·哈希算法·散列表
源代码•宸35 分钟前
Leetcode—509. 斐波那契数【简单】
经验分享·算法·leetcode·面试·golang·记忆化搜索·动规
逍遥德1 小时前
java Map Set List 扩容机制
java·开发语言·list
高山上有一只小老虎1 小时前
mybatisplus实现分页查询
java·spring boot·mybatis
nbsaas-boot1 小时前
基于 Java 21 ScopedValue 的多租户动态数据源完整实践
java·开发语言
2301_780669861 小时前
线程安全、线程同步(三种加锁方式)、线程池(两种创建线程池方式、线程池处理Runnable任务、线程池处理Callable任务)、并发/并行
java