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

数组中的逆序对

https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5

# @param nums int整型一维数组 
# @return int整型
#
class Solution:
    MOD = 1000000007  # 定义常量
    # 事实上函数名应该小写
    def InversePairs(self, nums: List[int]) -> int:
        n = len(nums)
        temp = [0 for i in range(n)]
        # 处理n个元素
        return self.merge_sort(nums, 0, n - 1, temp)

    def merge_sort(self, nums: List[int], low: int, high: int, temp: List[int]) -> int:
        mid = int((low + high) / 2)
        # 终止条件
        if low >= high:
            return 0
        # !!!注意low, high是序号
        p = self.merge_sort(nums, low, mid, temp) + self.merge_sort(nums, mid + 1, high, temp)
        i, j = low, mid + 1
        # 建立相同数组
        for x in range(low, high + 1):
            temp[x] = nums[x]

        # 遍历数组
        for x in range(low, high + 1):
            # 若数组1全部插入,直接放入数组2数据
            if i == mid + 1:
                nums[x] = temp[j]
                j += 1

            # 若数组2全部插入,直接放入数组1数据
            elif j == high + 1:
                nums[x] = temp[i]
                i += 1

            else:
                if temp[i] <= temp[j]:  # 选择小的数组值插入
                    nums[x] = temp[i]
                    i += 1
                else:
                    nums[x] = temp[j]
                    j += 1
                    p += mid - i + 1

        return p % self.MOD

Day 1 2024.1.8

有点难,利用了归并排序解决问题,难点是首先要采用二路归并分化问题,其次是要理解通过有序数组的较小值小于给定值,那么其剩余值必然都小于给定值来减少比较次数,进行优化。

剑指offer 文章被收录于专栏

一些自用刷题记录

全部评论

相关推荐

07-18 10:39
门头沟学院 Java
点赞 评论 收藏
分享
S_Holmes:一想到我苦苦追求的迪子私下里却是985的马子,我的心就在滴血😭😭😭
点赞 评论 收藏
分享
程序员小白条:这比例牛逼,750:1
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务