315. Count of Smaller Numbers After Self

Difficulty:
Related Topics:
Similar Questions:

Problem

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:

Solution

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var countSmaller = function(nums) {
    const smallerArr = Array(nums.length).fill(0);

    function mergeSort(nums) {
        if (nums.length <= 1) return nums;
        const mid = Math.floor(nums.length / 2);
        const left = mergeSort(nums.slice(0, mid));
        const right = mergeSort(nums.slice(mid));
        return merge(left, right);
    }

    function merge(left, right) {
        const result = [];
        let l = 0, r = 0;
        while (l < left.length || r < right.length) {
            if (r >= right.length || (l < left.length && left[l][1] <= right[r][1])) {
                result.push(left[l]);
                smallerArr[left[l][0]] += r;
                l += 1;
            } else {
                result.push(right[r]);
                r += 1;
            }
        }
        return result;
    }
    const temp = [];
    nums.map((e,i) => temp.push([i, e]));
    mergeSort(temp);
    return smallerArr;
};

Explain:

nope.

Complexity: