Count of Smaller Numbers After Self LeetCode solution in JavaScript

1
var countSmaller = function (nums) {
2
if (nums === null || nums.length == 0) return [];
3

4
let N = nums.length;
5
const result = new Array(N).fill(0);
6
const numsWithIdx = new Array(N).fill(0);
7

8
for (let i = 0; i < nums.length; i++) {
9
const curr = nums[i];
10

11
numsWithIdx[i] = { val: curr, originalIdx: i };
12
}
13

14
divideAndConqueuer(0, nums.length - 1);
15

16
const resultList = [];
17
result.forEach((el) => resultList.push(el));
18

19
return resultList;
20

21
function divideAndConqueuer(left, right) {
22
if (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);
27
}
28
}
29

30
function merge(left, mid, right) {
31
const leftLen = mid - left + 1;
32
const rightLen = right - mid;
33

34
let rightSmallers = 0;
35

36
const leftAux = new Array(leftLen).fill(0);
37
const rightAux = new Array(rightLen).fill(0);
38

39
for (let i = 0; i < leftLen; i++) {
40
leftAux[i] = numsWithIdx[left + i];
41
}
42

43
for (let i = 0; i < rightLen; i++) {
44
rightAux[i] = numsWithIdx[mid + 1 + i];
45
}
46

47
let leftPointer = 0;
48
let rightPointer = 0;
49
let insertAtPointer = left;
50

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++];
55
} else {
56
numsWithIdx[insertAtPointer++] = rightAux[rightPointer++];
57
rightSmallers++;
58
}
59
}
60

61
while (rightPointer < rightLen) {
62
numsWithIdx[insertAtPointer++] = rightAux[rightPointer++];
63
}
64

65
while (leftPointer < leftLen) {
66
result[leftAux[leftPointer].originalIdx] += rightSmallers;
67
numsWithIdx[insertAtPointer++] = leftAux[leftPointer++];
68
}
69
}
70
};

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0