Count pairs (i, j) such that i < j and arr[i] > arr[j] using merge sort.
Problem Statement
Examples
Input: arr = [2, 4, 1, 3, 5]
Output: 3
Explanation: Inversion pairs: (2, 1), (4, 1), (4, 3).
Input: arr = [2, 3, 4, 5, 6]
Output: 0
Explanation: Combining the input according to Count Inversions logic yields 0.
Input: arr = [5, 4, 3, 2, 1]
Output: 10
Explanation: Combining the input according to Count Inversions logic yields 10.
Complexity
Time Complexity: O(N log N)
Space Complexity: O(N)
Hints
Editorial & Approach
Problem Overview & Intuition
A brute force checks all pairs in O(N²). During Merge Sort, when picking an element from the right subarray because arr[i] > arr[j], every remaining element in the sorted left subarray [i...mid] is also strictly greater than arr[j], contributing mid - i + 1 inversions in O(N log N).
Step-by-Step Approach
- Divide the array into two halves recursively.
- Count inversions in left half and right half.
- During the merge step, whenever
arr[i] > arr[j], addmid - i + 1to inversion count. - Return total inversions accumulated.
Optimal Implementation (JavaScript)
function countInversions(arr) {
const temp = new Array(arr.length);
function mergeSort(left, right) {
let inv = 0;
if (left < right) {
const mid = Math.floor((left + right) / 2);
inv += mergeSort(left, mid);
inv += mergeSort(mid + 1, right);
inv += merge(left, mid, right);
}
return inv;
}
function merge(left, mid, right) {
let i = left, j = mid + 1, k = left, inv = 0;
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) temp[k++] = arr[i++];
else {
temp[k++] = arr[j++];
inv += (mid - i + 1);
}
}
while (i <= mid) temp[k++] = arr[i++];
while (j <= right) temp[k++] = arr[j++];
for (let p = left; p <= right; p++) arr[p] = temp[p];
return inv;
}
return mergeSort(0, arr.length - 1);
}
Complexity Analysis
Edge Cases & Corner Traps Handled
- Already sorted array: returns 0.
- Reverse sorted array: returns N * (N - 1) / 2.
- Array with identical elements.