1
var countSmaller = function (nums) {2
if (nums === null || nums.length == 0) return [];5
const result = new Array(N).fill(0);6
const numsWithIdx = new Array(N).fill(0);8
for (let i = 0; i < nums.length; i++) {11
numsWithIdx[i] = { val: curr, originalIdx: i };14
divideAndConqueuer(0, nums.length - 1);16
const resultList = [];17
result.forEach((el) => resultList.push(el));21
function divideAndConqueuer(left, right) {23
const mid = Math.floor(left + (right - left) / 2);24
divideAndConqueuer(left, mid);25
divideAndConqueuer(mid + 1, right);26
merge(left, mid, right);30
function merge(left, mid, right) {31
const leftLen = mid - left + 1;32
const rightLen = right - mid;34
let rightSmallers = 0;36
const leftAux = new Array(leftLen).fill(0);37
const rightAux = new Array(rightLen).fill(0);39
for (let i = 0; i < leftLen; i++) {40
leftAux[i] = numsWithIdx[left + i];43
for (let i = 0; i < rightLen; i++) {44
rightAux[i] = numsWithIdx[mid + 1 + i];49
let insertAtPointer = left;51
while (leftPointer < leftLen && rightPointer < rightLen) {52
if (leftAux[leftPointer].val <= rightAux[rightPointer].val) {53
result[leftAux[leftPointer].originalIdx] += rightSmallers;54
numsWithIdx[insertAtPointer++] = leftAux[leftPointer++];56
numsWithIdx[insertAtPointer++] = rightAux[rightPointer++];61
while (rightPointer < rightLen) {62
numsWithIdx[insertAtPointer++] = rightAux[rightPointer++];65
while (leftPointer < leftLen) {66
result[leftAux[leftPointer].originalIdx] += rightSmallers;67
numsWithIdx[insertAtPointer++] = leftAux[leftPointer++];