小和定义:
例如:数组s = [1, 3, 5, 2, 4, 6],在s[0]的左边小于或者等于s[0]的数的和为0,在s[1]的左边小于或等于s[1]的数的和为1,在s[2]的左边小于或等于s[1]的数的和为1+3=4……将所有位置的左边比它小或者等于的数的和相加起来就是小和。 s的小和=0+1+4+1+6+15=27
给定一个数组,实现函数返回s的小和。
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
int[] arr= {1,3,5,2,4,6};
int[] copy=new int[arr.length];
System.arraycopy(arr, 0, copy, 0, arr.length);//!!!
int smallSum=getSmallSum(arr,copy,0,arr.length-1);
System.out.println(smallSum);
}
public static int getSmallSum(int[] arr,int[] copy,int l,int r) {
if(l==r) {
return 0;
}
int mid=(l+r)>>1;
int leftSum=getSmallSum(copy,arr,l,mid);
int rightSum=getSmallSum(copy,arr,mid+1,r);
int i=l;
int j=mid+1;
int copyIdx=l;//
int smallSum=0;
while(i<=mid&&j<=r) {
if(arr[i]>arr[j]) {
copy[copyIdx++]=arr[j++];
}
else {
smallSum+=arr[i]*(r-j+1);//
copy[copyIdx++]=arr[i++];
}
}
while(i<=mid) {
copy[copyIdx++]=arr[i++];
}
while(j<=r) {
copy[copyIdx++]=arr[j++];
}
return smallSum+leftSum+rightSum;
}
}
[程序员代码面试指南]数组和矩阵-计算数组的小和(归并排序)
原文:https://www.cnblogs.com/coding-gaga/p/10853397.html