在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。
public class SmallSum {
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 mid,int R){
int p = L;
int q = mid+1;
int[] res = new int[R - L +1];
int k=0;
int sum = 0;
while(p<=mid && q<=R){
sum += arr[p] < arr[q] ? (R-q+1)*arr[p] : 0;
res[k++] = arr[p] < arr[q] ? arr[p++] :arr[q++];
}
while(p<=mid){
res[k++] = arr[p++];
}
while(q<=R){
res[k++] = arr[q++];
}
for(int j = 0;j<res.length;j++){
arr[L+j] = res[j];
}
return sum;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {1,3,4,2,5};
System.out.println(process(arr,0,arr.length-1));
}
}在这里插入代码片