剑指 Offer 51. 数组中的逆序对

剑指 Offer 51. 数组中的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

示例 1:
输入: [7,5,6,4]
输出: 5

限制:
0 <= 数组长度 <= 50000

题解:
参照https://zhuanlan.zhihu.com/p/181707064

代码如下:
class Solution(object):
def reversePairs(self, nums):
count = 0
def merge_sort(start, end):
if start >= end:
return 0
mid = (end + start) // 2
count = merge_sort(start, mid) + merge_sort(mid + 1, end)
p1 = start
p2 = mid + 1
tmp = []
while p1 <= mid and p2 <= end:
if nums[p1] > nums[p2]:
count += mid - p1 + 1 #左侧最小值都大于右侧,则左侧个数就是逆序对数
tmp.append(nums[p2])
p2 += 1
else:
tmp.append(nums[p1])
p1 += 1
while p1 <= mid:
tmp.append(nums[p1])
p1 += 1
while p2 <= end:
tmp.append(nums[p2])
p2 += 1
for i in range(len(tmp)):
nums[start + i] = tmp[i] #使其
return count

return merge_sort(0, len(nums) - 1)

 

posted on 2021-10-29 11:16  random_boy  阅读(12)  评论(0)    收藏  举报

导航