206 - 315 计算右侧小于当前元素的个数

题目

给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。

示例:

输入: [5,2,6,1] 输出: [2,1,1,0] 解释: 5 的右侧有 2 个更小的元素 (2 和 1). 2 的右侧仅有 1 个更小的元素 (1). 6 的右侧有 1 个更小的元素 (1). 1 的右侧有 0 个更小的元素.

解答

https://leetcode.com/problems/count-of-smaller-numbers-after-self/discuss/76584/Mergesort-solution

光头大佬的解法不能通过,但评论中有解法可以通过。。

class Solution:
    def countSmaller(self, nums: List[int]) -> List[int]:
        if not nums:
            return []
        res = [0]*len(nums)
        tupn = [(n, i) for i, n in enumerate(nums)]

        def divide(tupn):
            if len(tupn) == 1:
                return tupn
            mid = len(tupn)//2
            left = divide(tupn[:mid])
            right = divide(tupn[mid:])
            return conquer(left, right)

        def conquer(left, right):
            sor = []
            i = j = 0
            while i < len(left) and j < len(right):
                if left[i][0] > right[j][0]:
                    sor.append(left[i])
                    res[left[i][1]] += len(right)-j
                    i += 1
                else:
                    sor.append(right[j])
                    j += 1
            sor.extend(left[i:] or right[j:])
            return sor

        divide(tupn)
        return res

Runtime: 176 ms, faster than 40.67% of Python3 online submissions for Count of Smaller Numbers After Self.

Memory Usage: 17.1 MB, less than 37.50% of Python3 online submissions for Count of Smaller Numbers After Self.

Last updated

Was this helpful?