0
点赞
收藏
分享

微信扫一扫

剑指 Offer II 013. 二维子矩阵的和

晚熟的猫 2022-01-12 阅读 59

算法记录

LeetCode 题目:

  给定一个二维矩阵 matrix,以下类型的多个请求:计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2) 。


思路


说明

一、题目

  实现 NumMatrix 类:

  • NumMatrix(int[][] matrix) 给定整数矩阵 matrix 进行初始化
  • int sumRegion(int row1, int col1, int row2, int col2) 返回左上角 (row1, col1) 、右下角 (row2, col2) 的子矩阵的元素总和。

二、分析

  • 分析题目可得是一个一次存储多次计算读取的任务,那就需要构建一个可以快速返回计算结果的结构。
  • 从概率论的二维分布引出,可以求取每一个二维点的前缀和,然后只需要减去两个边缘的前缀再添加上一个多减去的前缀即可。
  • 难点就转换为构建二维矩阵的前缀和,前缀和用同样的思想来计算,加上点所代表的值即可。
class NumMatrix {
    private int[][] sums;
    public NumMatrix(int[][] matrix) {
        sums = new int[matrix.length][matrix[0].length];
        for(int i = 0; i < sums.length; i++) {
            for(int j = 0; j < sums[0].length; j++) {
                int sum = 0;
                if((i - 1) >= 0) sum += sums[i - 1][j];
                if((j - 1) >= 0) sum += sums[i][j - 1];
                if(((j - 1) >= 0) && ((i - 1) >= 0)) sum -= sums[i - 1][j - 1];
                sums[i][j] = sum + matrix[i][j];
            }
        }
    }
    
    public int sumRegion(int row1, int col1, int row2, int col2) {
        int sum = sums[row2][col2];
        if((col1 - 1) >= 0) sum -= sums[row2][col1 - 1];
        if((row1 - 1) >= 0) sum -= sums[row1 - 1][col2];
        if(((row1 - 1) >= 0) && ((col1 - 1) >= 0)) sum += sums[row1 - 1][col1 - 1];
        return sum;
    }
}

总结

熟悉前缀和的特性。

举报

相关推荐

矩阵-搜索二维矩阵II

0 条评论