美文网首页
面试题51. 数组中的逆序对

面试题51. 数组中的逆序对

作者: RayRaymond | 来源:发表于2020-04-24 14:43 被阅读0次

面试题51. 数组中的逆序对

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

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

两次遍历数组暴力解(超时)

class Solution:
    def reversePairs(self, nums: List[int]) -> int:
        cnt = 0
        n = len(nums)
        for x in range(n):
            for y in range(x,n):
                if nums[x] > nums[y]:
                    cnt += 1
        return cnt

归并排序

class Solution:
    def reversePairs(self, nums: List[int]) -> int:
        n = len(nums)
        if n <= 1:
            return 0
        
        M = n // 2
        L = nums[:M]
        R = nums[M:]
        result = self.reversePairs(L) + self.reversePairs(R)
        
        # union left and right
        L.sort()
        R.sort()
        index = 0
        for j in range(len(R)):
            while index < len(L) and L[index] <= R[j]:
                index += 1
            else:
                result += (len(L) - index)
        return result
class Solution:
    def reversePairs(self, nums: List[int]) -> int:

        def mergeSort(l = 0, r=len(nums)):
            if r - l > 1:
                mid = (l + r)//2

                mergeSort(l, mid)
                mergeSort(mid, r)

                i, j, tmp = l, mid, []
                while i < mid and j < r:
                    if nums[i] <= nums[j]:
                        tmp.append(nums[i])
                        i += 1
                    else:
                        tmp.append(nums[j])
                        j += 1
                        self.cnt += mid - i
                tmp.extend(nums[i:mid] if i<mid else nums[j:r])
                nums[l:r] = tmp

        self.cnt = 0
        mergeSort()
        return self.cnt

相关文章

  • LeetCode 面试题51. 数组中的逆序对

    面试题51. 数组中的逆序对 题目来源:https://leetcode-cn.com/problems/shu-...

  • 面试题51. 数组中的逆序对

    面试题51. 数组中的逆序对 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入...

  • 每日leetcode 面试题51 2020-03-21

    面试题51. 数组中的逆序对 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入...

  • 面试题51. 数组中的逆序对

    面试题51. 数组中的逆序对 用的是mergesort的思路,对于一个数组,我们将其分为前后两列,我们可以先分别统...

  • 数组中的逆序对

    剑指 Offer 51. 数组中的逆序对[https://leetcode-cn.com/problems/shu...

  • 面试题51. 数组中的逆序对

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

  • 题解剑指offer51题数组中的逆序对所遇bug分析

    1.题目链接 剑指 Offer 51. 数组中的逆序对[https://leetcode-cn.com/probl...

  • 剑指offer【50~59】

    题目链接: 剑指offer 50-59 目录: 50. 第一个只出现一次的字符位置51. 数组中的逆序对52. 两...

  • 数组中的逆序对

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

  • 数组中的逆序对

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

网友评论

      本文标题:面试题51. 数组中的逆序对

      本文链接:https://www.haomeiwen.com/subject/xklfwhtx.html