/**
* Created by lxw, liwei4939@126.com on 2017/11/3.
* 计算数组的小和
* 归并排序
*/
public class arraySmallSum {
public int getSmallSum(int[] arr){
if(arr ==null || arr.length == 0){
return 0;
}
return fun(arr, 0, arr.length - 1);
}
public int fun(int[] s, int l, int r){
if(l == r){
return 0;
}
int mid = (l + r) /2;
return fun(s, l, mid) + fun(s, mid + 1, r) + merge(s, l, mid, r);
}
public int merge(int[] s, int left, int mid, int right){
int[] h = new int[right - left + 1];
int hi = 0;
int i = left;
int j =mid + 1;
int smallSum = 0;
while (i<= mid && j <= right){
if(s[i] <= s[j]){
smallSum += s[i] * (right - j +1);
h[hi++] = s[i++];
} else {
h[hi++] = s[j++];
}
}
for (; (j < right + 1) || (i < mid +1); i++, j++){
h[hi++] = i > mid ? s[j] : s[i];
}
for (int k=0; k< h.length; k++){
s[left++] = h[k];
}
return smallSum;
}
public static void main(String[] args){
arraySmallSum tmp = new arraySmallSum();
int[] arr = {1, 3, 5, 2, 4, 6};
System.out.println(tmp.getSmallSum(arr));
}
}
计算数组的小和
最新推荐文章于 2020-10-25 21:20:47 发布