在一个数组中,一个数左边比它小的数的总和,叫数的小和,所有数的小和累加起来叫数组的小和,求数组小和
public class SmallSum {
//递归
public static int smallSum(int[] arr) {
if(arr==null||arr.length<2) {
return 0;
}
return process(arr,0,arr.length-1);
}
public static int process(int[] arr,int l,int r) {
if(l==r) {
return 0;
}
int mid=l+((r-l)>>1);
return process(arr,l,mid)+process(arr,mid+1,r)+merge(arr,l,mid,r);
}
public static int merge(int[] arr,int L,int m,int r) {
int[] help=new int[r-L+1];
int i=0;
int p1=L;
int p2=m+1;
int res=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;
}
//暴力
public static int comparator(int[] arr) {
if(arr==null||arr.length<2) {
return 0;
}
int res=0;
for(int i=1;i<arr.length;i++) {
for(int j=0;j<i;j++) {
res+=arr[j]<arr[i]?arr[j]:0;
}
}
return res;
}
public static void main(String[] args) {
int[] arr=new int[] {1,3,4,2,5};
int smallSum=process(arr,0,arr.length-1);
System.out.println(smallSum);
}
}