1. 初始化扩展的二维前缀和数组
创建一个大小为 (rows + 1) x (cols + 1) 的二维前缀和数组,其中 rows 和 cols 分别是原始数组的行数和列数。然后,我们按以下方式填充这个数组:
void initPrefixSum(vector<vector<int>>& prefixSum, const vector<vector<int>>& matrix) {
int rows = matrix.size();
int cols = matrix[0].size();
// 初始化扩展了的前缀和数组
prefixSum.resize(rows + 1, vector<int>(cols + 1, 0));
for (int i = 1; i <= rows; ++i) {
for (int j = 1; j <= cols; ++j) {
prefixSum[i][j] = matrix[i - 1][j - 1]
+ prefixSum[i - 1][j]
+ prefixSum[i][j - 1]
- prefixSum[i - 1][j - 1];
}
}
}
2. 查询扩展的二维前缀和数组
由于我们的前缀和数组是扩展过的,因此查询时的坐标也需要相应地调整。例如,如果我们要查询原始数组中从 (x1, y1) 到 (x2, y2) 的子矩阵的和,我们可以使用以下代码进行查询:
int queryPrefixSum(const vector<vector<int>>& prefixSum, int x1, int y1, int x2, int y2) {
// 调整索引,因为前缀和数组是扩展了的
int sum = prefixSum[

本文详细介绍了如何在C++中使用二维前缀和数组进行扩展、查询子矩阵和以及还原原始数组的过程,包括初始化扩展数组、调整查询坐标和逆差分操作的示例代码。
最低0.47元/天 解锁文章
780

被折叠的 条评论
为什么被折叠?



