题解 | #数组中的逆序对#
数组中的逆序对
https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5
class Solution:
def merge_sort_and_count(self,arr):
"""
归并排序并统计逆序对的数量
Args:
arr: 待排序的数组
Returns:
排序后的数组和逆序对的数量
"""
if len(arr) <= 1:
return arr, 0
mid = len(arr) // 2
left, left_count = self.merge_sort_and_count(arr[:mid]) # 对左半部分进行归并排序
right, right_count = self.merge_sort_and_count(arr[mid:]) # 对右半部分进行归并排序
merged, merge_count = self.merge_and_count(left, right) # 归并左右两部分并统计逆序对数量
total_count = left_count + right_count + merge_count # 总逆序对数量
return merged, total_count
def merge_and_count(self, left, right):
"""
合并左右两个有序数组并统计逆序对的数量
Args:
left: 左半部分有序数组
right: 右半部分有序数组
Returns:
合并后的有序数组和逆序对的数量
"""
merged = []
count = 0 # 用于统计逆序对的数量
i, j = 0, 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
merged.append(left[i])
i += 1
else:
merged.append(right[j])
j += 1
count += len(left) - i # 统计逆序对数量
merged.extend(left[i:])
merged.extend(right[j:])
return merged, count
def InversePairs(self , data: list[int]) -> int:
"""
计算逆序对的数量,并对结果取模
Args:
nums: 输入的整数数组
Returns:
逆序对数量取模的结果
"""
_, count = self.merge_sort_and_count(data)
return count % 1000000007


