diff --git a/src/leo/class02/SmallSum.java b/src/leo/class02/SmallSum.java index a8e0c40..a8d50f4 100644 --- a/src/leo/class02/SmallSum.java +++ b/src/leo/class02/SmallSum.java @@ -272,6 +272,48 @@ class SmallSum5{ } } +class SmallSum6{ + public static int smallSum(int[] arr) { + if (arr.length < 2 || arr == null) { + return 0; + } + + return process(arr, 0, arr.length - 1); + } + + private static int process(int[] arr, int l, int r) { + if (l == r) { + return 0; + } + int m = l + ((r - l) >> 1); + return process(arr, l, m) + process(arr, m + 1, r) + merge(arr, l, m, r); + + } + + private static int merge(int[] arr, int l, int m, int r) { + + int[] help = new int[r - l + 1]; + int res = 0; + int p1 = l; + int p2 = m + 1; + int i = 0; + while (p1 <= m && p2 <= r) { + res += arr[p1] < arr[p2] ? (r - p2 + 1) * arr[p1] : 0; + help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++]; + } + while (p1 <= m) { + help[i++] = arr[p1++]; + } + while (p2 <= r) { + help[i++] = arr[p2++]; + } + for (i = 0; i < help.length; i++) { + arr[l + i] = help[i]; + } + return res; + } +} + class TestSmallSum{ public static int smallSum(int[] arr) { if (arr.length < 2 || arr == null) { @@ -315,7 +357,7 @@ class TestMain { for (int i = 0; i < testTime; i++) { int[] arr = ArrayUtil.randomArray(maxSize, range); int[] copyArray = ArrayUtil.copyArray(arr); - int sum = SmallSum5.smallSum(arr); + int sum = SmallSum6.smallSum(arr); int testSum = TestSmallSum.smallSum(copyArray); if (testSum != sum) { System.out.println("sum :" + sum + ", testSum : " + testSum);