From 97888cbae8afb574ac6f0b8891b138a694d43cb8 Mon Sep 17 00:00:00 2001 From: Ja-hard Date: Mon, 28 Oct 2024 10:21:35 +0800 Subject: [PATCH] Update Code01_SmallSum.java Simplified the logic while calculate the SmallSum. --- src/class022/Code01_SmallSum.java | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/class022/Code01_SmallSum.java b/src/class022/Code01_SmallSum.java index f7a1d0ecc..5250a233f 100644 --- a/src/class022/Code01_SmallSum.java +++ b/src/class022/Code01_SmallSum.java @@ -54,25 +54,27 @@ public static long smallSum(int l, int r) { // 返回跨左右产生的小和累加和,左侧有序、右侧有序,让左右两侧整体有序 // arr[l...m] arr[m+1...r] public static long merge(int l, int m, int r) { - // 统计部分 + // 统计用变量 long ans = 0; - for (int j = m + 1, i = l, sum = 0; j <= r; j++) { - while (i <= m && arr[i] <= arr[j]) { - sum += arr[i++]; - } - ans += sum; - } + long acc = 0; // 正常merge int i = l; int a = l; int b = m + 1; while (a <= m && b <= r) { - help[i++] = arr[a] <= arr[b] ? arr[a++] : arr[b++]; + if (arr[a] <= arr[b]) { + acc += arr[a]; + help[i++] = arr[a++]; + } else { + ans += acc; + help[i++] = arr[b++]; + } } while (a <= m) { help[i++] = arr[a++]; } while (b <= r) { + ans += acc; help[i++] = arr[b++]; } for (i = l; i <= r; i++) { @@ -81,4 +83,4 @@ public static long merge(int l, int m, int r) { return ans; } -} \ No newline at end of file +}