二维数组之二维前缀和首篇

文章详细解释了如何计算二维矩阵的前缀和,通过递推公式避免重复计算,并介绍了如何利用前缀和快速求解特定区域的和。同时提及在矩阵不可变的情况下进行区域和检索的应用.
摘要由CSDN通过智能技术生成

讲解-前缀和

        先给出一个示例,在给出计算二维矩阵二维前缀和的公式。
请添加图片描述
         要求f(2,2)前缀和,需要求f(1,2)、f(2,1)以及f(1,1)的前缀和,显然f(1,2)和f(2,1)会加上两次f(1,1),所以需要减去一次f(1,1)最后加上矩阵martix[2][2]的值。
请添加图片描述
        求二维矩阵前缀和代码如下。前两个for循环是将左侧和上侧进行初始化。


public int[][] getPreSum(int[][] matrix) {
	int[][] preSum;
    int m = matrix.length;
    int n = matrix[0].length;
    preSum = new int[m][n];
    for(int i = 0;i < m;i++){
        if(i == 0){
            preSum[i][0] = matrix[i][0]; 
        }else{
            preSum[i][0] = preSum[i - 1][0] + matrix[i][0]; 
        }
    }
    for(int j = 0;j < n;j++){
        if(j == 0){
            preSum[0][j] = matrix[0][j]; 
        }else{
            preSum[0][j] = preSum[0][j - 1] + matrix[0][j]; 
        }
    }
    for(int i = 1;i < m;i++){
        for(int j = 1; j < n;j++){
            preSum[i][j] = preSum[i - 1][j] + preSum[i][j - 1] - preSum[i - 1][j - 1] + matrix[i][j]; 
        }
    }
    return preSum;
}

讲解-区域和

         有了前缀和,就很容易求解矩阵某个区域的和。求解区域和公式如下。显然要求和区域和为r(1,1,2,2),需要知道f(2,2)、f(2,0)、f(0,2)以及f(0,0),显然f(2,2)剪去f(0,2)和f(2,0)会多减去一次f(0,0),需要再加上一次f(0,0)。
请添加图片描述
         求区域和代码如下,主要注意的是,当row1-1和col1-1小于零时需要考虑特殊,如果为下标小于零,则将公式中的对应下标小于零的项去除即可。

public int sumRegion(int[][] preSum, int row1, int col1, int row2, int col2) {
    int res = 0;
    if(row1 - 1 < 0 && col1 - 1 < 0){
        res = preSum[row2][col2];
    }else if(col1 - 1 < 0){
        res = preSum[row2][col2] - preSum[row1 - 1][col2];
    }else if(row1 - 1 < 0){
        res = preSum[row2][col2] - preSum[row2][col1 - 1];
    }else{
        res = preSum[row2][col2] - preSum[row2][col1 - 1] - preSum[row1 - 1][col2] + preSum[row1 - 1][col1 - 1];
    }
    return res;
}

实战

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值