315 Count of Smaller Numbers After Self

Given an integer array nums, return an integer array counts where counts[i] is the number of smaller elements to the right of nums[i].

Example 1:

Input: nums = [5,2,6,1]
Output: [2,1,1,0]
Explanation:
To the right of 5 there are 2 smaller elements (2 and 1).
To the right of 2 there is only 1 smaller element (1).
To the right of 6 there is 1 smaller element (1).
To the right of 1 there is 0 smaller element.

Example 2:

Input: nums = [-1]
Output: [0]

Example 3:

Input: nums = [-1,-1]
Output: [0,0]

Constraints:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution:
    def countSmaller(self, nums: List[int]) -> List[int]:
        def sort(enums):
            length = len(enums)
            half = length // 2
            if not half:
                return enums
            left, right = sort(enums[:half]), sort(enums[half:])

            # merge in-place
            for i in range(length-1, -1, -1):
                if not right or (left and left[-1][1] > right[-1][1]):
                    # nums remained in right need to shift
                    # to the left of left[-1]
                    res[left[-1][0]] += len(right)
                    enums[i] = left.pop()
                else:
                    enums[i] = right.pop()
            return enums
        res = [0] * len(nums)
        sort(list(enumerate(nums)))
        return res