From a5176bebffdb7ec3e6a60c853ebb5e7f046dfd51 Mon Sep 17 00:00:00 2001 From: yanzhuang-h <126091390+yanzhuang-h@users.noreply.github.com> Date: Sun, 9 Feb 2025 10:10:59 +0800 Subject: [PATCH] =?UTF-8?q?Update=200044.=E5=BC=80=E5=8F=91=E5=95=86?= =?UTF-8?q?=E8=B4=AD=E4=B9=B0=E5=9C=9F=E5=9C=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 提供一个新的思路求解二维前缀和 --- ...55\344\271\260\345\234\237\345\234\260.md" | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git "a/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" "b/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" index 64804842f2..3b1d208b95 100644 --- "a/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" +++ "b/problems/kamacoder/0044.\345\274\200\345\217\221\345\225\206\350\264\255\344\271\260\345\234\237\345\234\260.md" @@ -166,8 +166,45 @@ int main () { } ``` +除了上述做法,还可采用的思路是直接求二维数组的前缀和,时间复杂度为 O(n^2), +```c++ +#include +#include - +using namespace std; +int main() { + int n, m; + scanf("%d%d", &n, &m); + // 这里采用n+1,m+1,是为了避免处理边界时潜在的溢出问题 + vector> val(n+1, vector(m+1, 0)); + vector> sum(n+1, vector(m+1, 0)); + for(int i = 1; i <= n; i++) { + for(int j = 1; j <= m; j++) { + scanf("%d", &val[i][j]); + + // 代码的核心,初始化前缀和数组 + sum[i][j] = val[i][j] + sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1]; + } + } + + int min = INT32_MAX; + //按行进行划分求最小值 + for(int i = 1; i <= n; i++) { + int sub = sum[n][m] - 2 * sum[i][m]; + sub = sub > 0 ? sub : (-sub); + min = min < sub ? min : sub; + } + //按列进行划分求最小值 + for(int j = 1; j <= m; j++) { + int sub = sum[n][m] - 2 * sum[n][j]; + sub = sub > 0 ? sub : (-sub); + min = min < sub ? min : sub; + } + + printf("%d", min); + return 0; +} +``` ## 其他语言版本