【LeetCode】面试题51 逆序对

举报
小雨青年 发表于 2022/03/29 00:59:34 2022/03/29
【摘要】 问题描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 输入: [7,5,6,4] 输出: 5 限制: 0 ...

问题描述

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

输入: [7,5,6,4]
输出: 5

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

问题分解

先用伪代码再现问题中的逻辑

if arr[i] > arr[j] and i < j , 则生成一个逆序对 n[i][j]

可推 : 拿出数组中的一个元素,对比之后的元素,只要大于之后的值,那么总数+1 ,这样得出来的就是暴力法

但是,显然暴力法是不可取的,因为会造成算法的超时

问题解决

归并排序

当归并排序执行合并数组的时候,可以比较两个数组指针对应的值,得出对应数组分别满足题目的数量,这样做相比暴力破解法可以大幅度降低执行时间。

具体解法参考下面代码,已经加了注释。

class Solution:
    def mergeSort(self, nums, tmp, l, r):
        if l >= r:
            return 0 #拆分到头
        mid = (l + r) // 2 # 找到中心段
        inv_count = self.mergeSort(nums, tmp, l, mid) + self.mergeSort(nums, tmp, mid + 1, r) #并操作
        i, j, pos = l, mid + 1, l
        while i <= mid and j <= r: 
            if nums[i] <= nums[j]:  # 进行数据比对,满足条件就增加计数
                tmp[pos] = nums[i]
                i += 1
                inv_count += (j - (mid + 1))
            else:
                tmp[pos] = nums[j]
                j += 1
            pos += 1
        for k in range(i, mid + 1):
            tmp[pos] = nums[k]
            inv_count += (j - (mid + 1))
            pos += 1
        for k in range(j, r + 1):
            tmp[pos] = nums[k]
            pos += 1
        nums[l:r+1] = tmp[l:r+1] 
        return inv_count

    def reversePairs(self, nums: List[int]) -> int: # 开始
        n = len(nums) # 得到数组长度
        tmp = [0] * n # 定义0填充的数组作为临时空间
        return self.mergeSort(nums, tmp, 0, n - 1) # 执行递归方法

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

参考资料

  • https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/
  • https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/solution/shu-zu-zhong-de-ni-xu-dui-by-leetcode-solution/

文章来源: coderfix.blog.csdn.net,作者:小雨青年,版权归原作者所有,如需转载,请联系作者。

原文链接:coderfix.blog.csdn.net/article/details/105727337

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。