一、最简单的就是遍历一遍算出小和
二、通过归并的方法
利用归并排序,分治 后用外排进行合并时同时求出这两段产生的小和。时间复杂度为n*logn
public static int littleSum(int[] arr) {
return mergeSort(arr, 0, arr.length - 1);
}
private static int mergeSort(int[] arr, int l, int r) {
if (r == l) {
return 0;
}
int mid = (l + r) / 2;
int res = mergeSort(arr, l, mid) + mergeSort(arr, mid + 1, r) + merge(arr, l, r, mid);
return res;
}
private static int merge(int[] arr, int l, int r, int mid) {
int res = 0;
int[] temp = new int[r - l + 1];
int indexL = l;
int indexR = mid + 1;
int index = 0;
while (indexL <= mid && indexR <= r) {
res += arr[indexL] < arr[indexR] ? arr[indexL] * (r - indexR + 1) : 0;
temp[index++] = arr[indexL] < arr[indexR] ? arr[indexL++] : arr[indexR++];
}
while (indexL <= mid) {
temp[index++] = arr[indexL++];
}
while (indexR <= r) {
temp[index++] = arr[indexR++];
}
for (int i = 0; i < temp.length; i++) {
arr[i + l] = temp[i];
}
return res;
}