小和问题
小和問題:在一個數組中,每一個數左邊比當前數小的數累加起來,叫做這個數組的小和,求一個數組的小和
例子:
[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 syssys.setrecursionlimit(10000)def mergeSort(L,l,r): if l == r:return 0mid = 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 = 0p1 = lp2 = m + 1res = 0while p1 <= m and p2 <= r:if L[p1] < L[p2]:res += (r-p2+1)*L[p1]help_[i] = L[p1]i +=1p1 +=1else:help_[i] = L[p2]i +=1p2 +=1while p1 <= m:help_[i] = L[p1]i +=1p1 +=1while p2 <= r:help_[i] = L[p2]i +=1p2 +=1for i in range(len(help_)):L[l+i] = help_[i]return resmergeSort([1,3,4,2,5],0,4)?
?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
- 上一篇: 《程序员代码面试指南第二版》Python
- 下一篇: 逆序对问题