二维数组前缀和

知识来源:刷题 :蓝桥杯https://www.dotcpp.com/oj/problem2659.html

prefixSum[i][j] = prefixSum[i - 1][j] + prefixSum[i][j - 1] - prefixSum[i - 1][j - 1] + grid[i - 1][j - 1];

//grid是输入的数据,prefixSum是我们用来记录二维前缀和的数组

这个公式用于计算二维前缀和数组 prefixSum 中的每个元素的值,其背后的逻辑基于容斥原理。让我们逐步解释这个公式:

首先,二维前缀和数组 prefixSum 的每个元素 prefixSum[i][j] 表示原数组 grid 中从 (0, 0) 到 (i-1, j-1) 的所有元素的和。换句话说,prefixSum[i][j] 是以 (i-1, j-1) 为右下角的矩形区域内所有元素的和。

为了计算 prefixSum[i][j],我们需要考虑以下几个部分:

  1. prefixSum[i - 1][j]:这是从 (0, 0) 到 (i-2, j-1) 的矩形区域内所有元素的和。
  2. prefixSum[i][j - 1]:这是从 (0, 0) 到 (i-1, j-2) 的矩形区域内所有元素的和。
  3. prefixSum[i - 1][j - 1]:这是从 (0, 0) 到 (i-2, j-2) 的矩形区域内所有元素的和。

当我们试图计算 prefixSum[i][j] 时,我们实际上想要的是从 (0, 0) 到 (i-1, j-1) 的和,这包括两部分:

  • 从 (0, 0) 到 (i-2, j-1) 的和(即 prefixSum[i - 1][j])。
  • 从 (0, 0) 到 (i-1, j-2) 的和(即 prefixSum[i][j - 1])。

但是,这两部分都重复计算了从 (0, 0) 到 (i-2, j-2) 的和,这部分和是 prefixSum[i - 1][j - 1]。因此,我们需要从 prefixSum[i - 1][j] 和 prefixSum[i][j - 1] 的和中减去 prefixSum[i - 1][j - 1],以避免重复计算。

最后,我们加上 grid[i - 1][j - 1],这是当前位置 (i-1, j-1) 的值,它尚未被包含在前述任何和中。

prefixSum[i][j] = prefixSum[i - 1][j] + prefixSum[i][j - 1] - prefixSum[i - 1][j - 1] + grid[i - 1][j - 1]

这个公式允许我们高效地计算二维前缀和数组,因为每个元素只依赖于其左侧、上方和左上方的元素,这样我们就可以在 O(mn) 的时间复杂度内填充整个 prefixSum 数组,其中 m 和 n 分别是 grid 的行数和列数。

  • 16
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值