题解 | 【模板】二维前缀和

【模板】二维前缀和

https://www.nowcoder.com/practice/99eb8040d116414ea3296467ce81cbbc

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n=scan.nextInt();//矩阵行数
        int m=scan.nextInt();//矩阵列数
        int q=scan.nextInt();//查询次数
	  //1.初始化矩阵  下标从1开始,防止越界访问
        int[][] arr=new int[n+1][m+1];
        for(int i=0;i<n+1;i++){
            for(int j=0;j<m+1;j++){
                if(i==0||j==0){
                    arr[i][j]=0;   //这里其实不必要对0再赋值,默认就是0,可以直接从下标为1开始赋值
                }else arr[i][j]=scan.nextInt();
            }
        }
	  // 构造 前缀和 数组矩阵,
        long[][] dp=new long[n+1][m+1];//定义为long,防溢出
        for(int i=0;i<n+1;i++){
            for(int j=0;j<m+1;j++){
                if(i==0||j==0){
                    dp[i][j]=0;
                }else{
                    dp[i][j]=dp[i][j-1]+dp[i-1][j]+arr[i][j]-dp[i-1][j-1];
                }
            }
        }
        while(q>0){
            int x1=scan.nextInt();
            int y1=scan.nextInt();
            int x2=scan.nextInt();
            int y2=scan.nextInt();
            long ret=dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1];
            System.out.println(ret);
            q--;
        }

    }
}

时间复杂度:O(m*n)+O(q)

构造前缀和矩阵: O(m*n),遍历一遍数组

对q次求和:O(q)

全部评论

相关推荐

2025-12-18 19:36
已编辑
门头沟学院 Java
程序员牛肉:可以的,简历没毛病了。 虽然还是偏向同质化,不过学历不错。后续我觉得重心放到刷实习+摆脱同质化问题上
实习简历求拷打
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务