算法技巧之计算二维数组区域和

本文介绍了如何利用前缀数组在O(MN)的时间复杂度内解决计算二维数组矩形区域和的问题,避免了暴力搜索的O(M^2N^2)复杂度。前缀数组P可以通过累加和公式进行计算,并能在O(1)时间内获取任意矩形区域的和。文章还给出了计算前缀数组的公式和Python实现。

在做算法题目的过程中,经常会遇到二维数组的题目,并且要以二维数组的任意矩形区域的和作为先验知识来进行之后的推算。

例如:已知大小M*N的矩阵A,求矩阵内任意矩形区域的和。

如果采用暴力搜索的方式,则需要O(M^2N^2)的时间复杂度,即需要枚举矩形的左上坐标和右下坐标。采用前缀数组的方式则可以在O(MN)的时间复杂度下得到结果。

前缀数组P:大小为M*N,P[i][j]表示为以(0,0)为左上角,(i,j)为右下角区域的矩形和。

通过前缀数组P,即可以计算原矩阵A内任意矩形区域的和。如计算(x1,y1)到(x2,y2)区域内的和,公式如下:

area = P[x2][y2] - P[x2][y1-1] - P[x1-1][y2] + P[x1-1][y1-1]

当i或j<0时,P[i][j] = 0。图解如下:

可以看到当得到前缀数组后,我们就可以在O(1)的时间内得到任意矩阵区域的数字和。

接下来就是如何得到前缀数组。我们假设前缀数组是按照行优先计算得到的。当计算P[i][j]的时候,前i-1行以及第i行的前j-1个以及得到了。对于A[i][j]这样一个1*1的区域而言,可以用上述公式计算得到:

A[i][j] = P[i][j] - P[i-1][j] - P[i][j-1] + P[i-1][j-1]

因为A[i][j],P[i-1][j],P[i][j-1],P[i-1][j-1]都已知,所以可以计算得到P[i][j]

P[i][j] = A[i][j] + P[i-1][j] +P[i][j-1] - P[i-1][j-1]

因此我们就可以在O(MN)的时间复杂度里得到前缀数组P,整个算法的时间复杂度为O(1)。

前缀数组python代码实现如下(为了避免判断,坐标从(1

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值