剑指offer

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

2020-03-26  本文已影响0人  人一己千

题目

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

示例 1:

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

限制:

0 <= 数组长度 <= 50000

来源:力扣(LeetCode)
链接: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/bao-li-jie-fa-fen-zhi-si-xiang-shu-zhuang-shu-zu-b/

如图所示,不过我用的开区间,比这个闭区间要简单。

代码

class Solution:
    def reversePairs(self, nums: List[int]) -> int:
        self.count = 0
        self.merge(nums, 0, len(nums))
        return self.count

    def merge(self,nums, start, end):
        if end - start <= 1: return 
        mid = (start + end)//2
        self.merge(nums, start, mid)
        self.merge(nums, mid, end)
        nums_part = []
        i = start
        j = mid
        while i < mid and j < end:
            if nums[i] <= nums[j]:
                nums_part.append(nums[i])
                i += 1
            else:
                self.count += mid - i
                nums_part.append(nums[j])
                j += 1
        if i<mid: nums_part.extend(nums[i:mid])
        if j<end: nums_part.extend(nums[j:end])
        assert len(nums_part) == end-start
        nums[start:end] = nums_part
上一篇下一篇

猜你喜欢

热点阅读