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) {
    var arr = nums.map((num, i) => [num, i]);
    var res = Array(nums.length).fill(0);
    mergeSort(arr, res);
    return res;
};

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

var merge = function(left, right, res) {
    var arr = [];
    var leftIndex = 0;
    var rightIndex = 0;
    while (leftIndex < left.length || rightIndex < right.length) {
        if (!right[rightIndex] || (left[leftIndex] && left[leftIndex][0] > right[rightIndex][0])) {
            arr.push(left[leftIndex]);
            res[left[leftIndex][1]] += right.length - rightIndex;
            leftIndex += 1;
        } else {
            arr.push(right[rightIndex]);
            rightIndex += 1;
        }
    }
    return arr;
};

Explain:

nope.

Complexity: