题解 | #数组中的逆序对#

数组中的逆序对

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

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务