LeetCode 304. 二维区域和检索 - 矩阵不可变

题目描述

304. 二维区域和检索 - 矩阵不可变

解法:二维前缀和

二维前缀和矩阵中的每一个格子记录的是「以当前位置为区域的右下角(区域左上角恒定为原数组的左上角)的区域和」,那么二维前缀和矩阵就可以按照如下图所示的方法生成

在这里插入图片描述
因此当我们要求 ( x 1 , y 1 ) (x1, y_1) (x1,y1) 作为左上角, ( x 2 , y 2 ) (x_2, y_2) (x2,y2) 作为右下角 的区域和的时候,可以直接利用前缀和数组快速求解:
s u m [ x 2 ] [ y 2 ] − s u m [ x 1 − 1 ] [ y 2 ] − s u m [ x 2 ] [ y 1 − 1 ] + s u m [ x 1 − 1 ] [ y 1 − 1 ] sum[x_2][y_2] - sum[x_1 - 1][y_2] - sum[x_2][y_1 - 1] + sum[x_1 - 1][y_1 - 1] sum[x2][y2]sum[x11][y2]sum[x2][y11]+sum[x11][y11]

class NumMatrix {
public:
    vector<vector<int>> sum;
    NumMatrix(vector<vector<int>>& matrix) {
        int n = matrix.size();
        if (n > 0)
        {
            int m = matrix[0].size();
            sum.resize(n + 1, vector<int>(m + 1, 0));
            for (int i = 1 ; i <= n; i++)
                for (int j = 1; j <= m; j++)
                    sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + matrix[i - 1][j - 1];
        }
    }
    
    int sumRegion(int row1, int col1, int row2, int col2) {
        row1++, row2++, col1++, col2++;
        return sum[row2][col2] - sum[row1 - 1][col2] - sum[row2][col1 - 1] + sum[row1 - 1][col1 -1];
    }
};

/**
 * Your NumMatrix object will be instantiated and called as such:
 * NumMatrix* obj = new NumMatrix(matrix);
 * int param_1 = obj->sumRegion(row1,col1,row2,col2);
 */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值