小和问题:在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和,求一个数组的小和
例子:
[1,3,4,2,5]
1-> 1
3-> 1
4 -> 1,3
5 -> 1,3,4,2
1+ 1+ 3+ 1 +1+3+4+2 = 16
此问题可以转化为当前值右侧有几个比当前值大,比较大的个数 * 当前值 求和,如:
1 -> 3,4,2,5 4*1
3 -> 4,5 2*2
4 -> 5 1*4
2 -> 5 1*2
import sys
sys.setrecursionlimit(10000)
def mergeSort(L,l,r):
if l == r:
return 0
mid = int(l + ((r-l)>>1))
return mergeSort(L,l,mid) + mergeSort(L,mid+1,r) + merge(L,l,mid,r)
def merge(L,l,m,r):
help_ = [0] * (r-l+1)
i = 0
p1 = l
p2 = m + 1
res = 0
while p1 <= m and p2 <= r:
if L[p1] < L[p2]:
res += (r-p2+1)*L[p1]
help_[i] = L[p1]
i +=1
p1 +=1
else:
help_[i] = L[p2]
i +=1
p2 +=1
while p1 <= m:
help_[i] = L[p1]
i +=1
p1 +=1
while p2 <= r:
help_[i] = L[p2]
i +=1
p2 +=1
for i in range(len(help_)):
L[l+i] = help_[i]
return res
mergeSort([1,3,4,2,5],0,4)