Advertisement
Guest User

Untitled

a guest
Mar 21st, 2019
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.42 KB | None | 0 0
  1. # 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。
  2. # 输入一个数组,求出这个数组中的逆序对的总数 P。并将 P 对 1000000007 取模的结果输出。即输出 P % 1000000007。
  3. # PS. 测试用例的数组长度可能超过 100k,防止超时。
  4.  
  5. class Solution:
  6. def InversePairs(self, data):
  7. p = self.inverse_pairs_count(data)
  8. return p % 1000000007
  9.  
  10. # 使用循环版归并排序(递归版本容易超过 python 最大递归深度)
  11. def inverse_pairs_count(self, data):
  12. p = 0
  13. data = data[:]
  14. step = 1
  15. while step < len(data):
  16. for start in range(0, len(data) - step, step * 2):
  17. mid = start + step
  18. end = min(start + step * 2, len(data))
  19. p += self.inverse_pairs_combine(data, start, mid, end)
  20. step *= 2
  21. return p
  22.  
  23. def inverse_pairs_combine(self, data, start, mid, end):
  24. p = 0
  25. l, r = start, mid
  26. tmp = []
  27. while l < mid and r < end:
  28. if data[l] > data[r]:
  29. tmp.append(data[r])
  30. r += 1
  31. p += mid - l
  32. else:
  33. tmp.append(data[l])
  34. l += 1
  35. if l < mid:
  36. tmp += data[l : mid]
  37. if r < end:
  38. tmp += data[r : end]
  39. data[start : end] = tmp
  40. return p
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement