在乙個陣列中,每乙個數左邊比當前數小的數累加起來,叫做這個陣列的小和。
例子:
輸入:[1, 3, 4, 2, 5]
輸出:16
1左邊比1小的數,沒有;
3左邊比3小的數,1;
4左邊比4小的數,1、3;
2左邊比2小的數,1;
5左邊比5小的數,1、3、4、2;
所以小和為1+1+3+1+1+3+4+2=16
實現的基本原理還是[歸併排序]
將當前序列分為兩個子串行,分別求其小和
對a劃分得到的兩個子串行進行merge操作,得到合併過程產生的小和,再加上a得到的兩個子串行的小和之和
遞迴地執行1和2
private
static
intsmallsum
(int
arr)
return
mergesort
(arr,
0, arr.length -1)
;}private
static
intmergesort
(int
arr,
int l,
int r)
int mid = l +
((r - l)
>>1)
;// 返回值為左右的小和加合併的小和
return
mergesort
(arr, l, mid)
+mergesort
(arr, mid +
1, r)
+merge
(arr, l, mid, r);}
private
static
intmerge
(int
arr,
int l,
int mid,
int r)
while
(p1 <= mid) temp[i++
]= arr[p1++];
while
(p2 <= r) temp[i++
]= arr[p2++];
for(i =
0; i < temp.length; i++
)return res;
}public
static
void
main
(string[
] args)
;int res =
smallsum
(arr)
; system.out.
println
(res)
;}
歸併排序 小和問題
public class mergesort sortprocess arr,0,arr.length 1 遞迴 public static void sortprocess int arr,int l,int r int mid l r l 1 sortprocess arr,l,mid t n ...
歸併排序 小和問題
問題描述 在乙個陣列中,每乙個數左邊比當前數小的數累加起來,叫做這個陣列的小和。求乙個陣列的小和。樣例 1,3,4,2,5 1左邊比1小的數,沒有 3左邊比3小的數,1 4左邊比4小的數,1 3 2左邊比2小的數,1 5左邊比5小的數,1 3 4 2 所以小和為1 1 3 1 1 3 4 2 16 ...
小和問題(歸併排序)
在乙個陣列中,每乙個數左邊比當前數小的數累加起來,叫做這個陣列的小和。求乙個陣列的小和。描述 1,3,2,51,5 1左邊比1小的數 0 3左邊比3小的數 1 2左邊比2小的數 1 51左邊比51小的數 2,3,1 5左邊比5小的數 2,3,1 所以小和為0 1 1 2 3 1 2 3 1 14 解...