C++将二维数组分块最大值存入一维数组出现垃圾值如何解决
问题原因
你的代码出现垃圾值的核心问题是最大值存入一维数组的时机和下标控制错误:
- 你把
flat[k] = ...和k++逻辑写在了「找到比当前mx更大的值」的if判断分支里,只有当块内元素刷新最大值时才会执行写入和下标自增。如果某个块的第一个元素就是最大值,这块的最大值根本不会写入数组;如果块内多次刷新最大值,会重复写入占用多个下标位,最终导致数组下标错位、甚至越界访问出现垃圾值。
修正后的实现
只需要把写入数组的逻辑移到「遍历完整个块、确定最终最大值」之后即可:
#include <stdio.h> int main() { int disp[4][4] = {{12, 14, 32, 9}, {19, 24, 3, 4}, {11, 26, 3, 8}, {13, 24, 7, 5} }; int quadrant_size = 2; int k = 0; int flat[4] = {0}; int N = 4; int x, y, i, j; for (x = 0 ; x < N ; x += quadrant_size) { for (y = 0 ; y < N ; y += quadrant_size) { int mx = disp[x][y]; // 遍历整个块找最大值 for (i = x ; i < x + quadrant_size ; i++) { for (j = y ; j < y + quadrant_size ; j++) { if (disp[i][j] > mx) { mx = disp[i][j]; } } } // 遍历完块再写入最大值,下标加1 flat[k] = mx; k++; printf("%d ", mx); } printf("\n"); } // 打印结果 for (i = 0; i < 4; i++) { printf("%d ", flat[i]); } return 0; }
运行后一维数组输出为24 32 26 8,符合预期。
更高性能的扩展方案
如果面对大规模二维数组、需要频繁分块查询最大值的场景,可以用二维稀疏表做预处理,预处理复杂度为O(NMlogNlogM),后续单次查询任意分块的最大值复杂度为O(1),适合查询量较大的场景。普通小规格矩阵直接用上述四层循环就足够,时间复杂度为O(NM),属于理论最优(每个元素仅遍历一次)。
内容的提问来源于stack exchange,提问作者user14997606
相关产品推荐
相关产品推荐

