-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path0493-reverse-pairs.js
More file actions
46 lines (38 loc) · 1.78 KB
/
0493-reverse-pairs.js
File metadata and controls
46 lines (38 loc) · 1.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/**
* Reverse Pairs
* Time Complexity: O(N log N)
* Space Complexity: O(N)
*/
var reversePairs = function (nums) {
let totalReversePairs = 0;
function sortAndCountPairs(workingArray, startIndex, endIndex) {
if (startIndex >= endIndex) {
return;
}
const midPoint = Math.floor((startIndex + endIndex) / 2);
sortAndCountPairs(workingArray, startIndex, midPoint);
sortAndCountPairs(workingArray, midPoint + 1, endIndex);
let rightPointerForCounting = midPoint + 1;
for (let leftPointerForCounting = startIndex; leftPointerForCounting <= midPoint; leftPointerForCounting++) {
while (rightPointerForCounting <= endIndex && workingArray[leftPointerForCounting] > 2 * workingArray[rightPointerForCounting]) {
rightPointerForCounting++;
}
totalReversePairs += (rightPointerForCounting - (midPoint + 1));
}
const temporaryMergedArray = [];
let leftHalfCursor = startIndex;
let rightHalfCursor = midPoint + 1;
while (leftHalfCursor <= midPoint || rightHalfCursor <= endIndex) {
if (leftHalfCursor <= midPoint && (rightHalfCursor > endIndex || workingArray[leftHalfCursor] <= workingArray[rightHalfCursor])) {
temporaryMergedArray.push(workingArray[leftHalfCursor++]);
} else if (rightHalfCursor <= endIndex) {
temporaryMergedArray.push(workingArray[rightHalfCursor++]);
}
}
for (let currentCopyIndex = 0; currentCopyIndex < temporaryMergedArray.length; currentCopyIndex++) {
workingArray[startIndex + currentCopyIndex] = temporaryMergedArray[currentCopyIndex];
}
}
sortAndCountPairs(nums, 0, nums.length - 1);
return totalReversePairs;
};