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

Posted 易小顺

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer II 013. 二维子矩阵的和相关的知识,希望对你有一定的参考价值。

算法记录

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;
    


总结

熟悉前缀和的特性。

以上是关于剑指 Offer II 013. 二维子矩阵的和的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer-013-二维子矩阵的和

LeetCode1074 / 560 / 1248 / 363 / 剑指 Offer 68 - II

355-II56-II1512

写写代码系列013:剑指offer题目——连续子数组的最大和(动态规划)

《剑指 Offer(第 2 版)》系列刷题

剑指 Offer II 107. 矩阵中的距离