剑指 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. 二维子矩阵的和的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode1074 / 560 / 1248 / 363 / 剑指 Offer 68 - II