求數組的小和

數組小和定義如下:有一數組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));
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章