求解最大最小数之和
题目了解:
给出数组,从第一位找出前面比自身小的数,直到最后一位,将这些数求和
例子:
arr = { 3, 4, 6, 5, 2, 1};
比3小有:因为第一个,所以没有,即为0
比4小有:3,保留
比6小有:3,4,故和为7
…
到最后1:前面没有,故为0
所以结果为0+3+7+7+0+0=17;
题解:
这里介绍的是利用归并排序解决
public static int smallSum(int[] arr) {
if(arr == null || arr.length < 2) {
return 0;
}
return mergeSort(arr, 0 , arr.length - 1);
}
public static int mergeSort(int[] arr, int l, int r) {
if(l == r) {
return 0;
}
int mid = (l + r)/ 2;
return mergeSort(arr, l ,mid)+
mergeSort(arr, mid + 1, r)+
merge(arr, l ,mid, r);
}
public static int merge(int[] arr, int L,int mid, int R) {
int[] help =new int[R- L + 1];
int rest = 0;
int i = 0;
int p1 = L;
int p2 = mid + 1;
while( p1 <= mid && p2 <= R ) {
//最重要的就是下面这句话,执行后,就是将每一次比较时的
//小的数累加
rest += arr[p1] < arr[p2] ? ((R - p2 + 1) * arr[p1] ) : 0 ;
help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
}
while(p1 <= mid) {
help[i++] = arr[p1++];
}
while(p2 <= R) {
help[i++]= arr[p2++];
}
for(i = 0;i < help.length;i++) {
arr[ L + i] = help[i];
}
return rest;
}
以上就是题解,感谢阅读,欢迎指错