數組小和定義如下:有一數組s=[1,3,5,2,4,6],在s[0]的左邊小於或等於s[0]的數的和爲0,在s[1]的左邊小於或等於s[1]的數的和爲1,以此類推,把每個元素的左邊小於或等於當前元素的和加起來,就是該數組的小和,s的小和爲0+1+4+1+6+15=37;
代碼如下:
public class Problem_02 {
public static int getSmallSum(int []array){
if(array==null && array.length==0){
return 0;
}
return func(array,0,array.length-1);
}
public static int func(int [] array,int l,int r){
if(l==r){
return 0;
}
int mid=(l+r)/2;
return func(array,l,mid)+func(array,mid+1,r)+merge(array,l,mid,r);
}
public static int merge(int [] s,int left,int mid,int right){
int[] hi=new int [right-left+1];
int i=left;
int j=mid+1;
int h=0;//標識hi數組的下標
int smallSum=0;//記錄小和
while(i<=mid && j<=right){
if(s[i]<s[j]){
smallSum+=s[i]*(right-j+1);
hi[h++]=s[i++];
}else{
hi[h++]=s[j++];
}
}
//一半已經遍歷完
for(;i<=mid ||j<=right;i++,j++){
hi[h++]=i>mid?s[j]:s[i];
}
//數組歸位
for(int k=0;k<hi.length;k++){
s[left++]=hi[k];
}
return smallSum;
}
public static void main(String[] args) {
int[] arr = {1,3,5,2,4,6};
System.out.println(getSmallSum(arr));
}
}