Approach Summary
Optimal solution for Count Inversions with O(nlogn) time complexity and O(n) space complexity.
Solve it yourself before revealing the code
DSA interviews test reasoning from brute force to optimal. Think through the constraints first.
Solution Progression (Brute Force → Most Optimized)
Understand the architectural evolution from naive baseline to optimal complexity.
| Approach | Time | Space | Core Strategy / Trade-off |
|---|---|---|---|
| 1 Approach 1: Baseline Brute Force | O(n^2) | O(n^2) | Exhaustive check or standard baseline evaluating all candidates. |
| 2 Approach 2: Optimal Interview Solution | O(nlogn) | O(n) | Optimal algorithmic solution utilizing direct state transitions and optimal data structures. |
Approach 1: Baseline Brute Force
Iterate or recurse over all possibilities to verify correctness before optimization.
Approach 1: Baseline Brute Force Implementation
Approach 1: Baseline Brute Force
class Solution {
static long merge(long arr[], long left, long mid, long right) {
long merged[] = new long[(int) (right - left + 1)];
long index1 = left;
long index2 = mid + 1;
long x = 0;
long countInversions = 0;
while (index1 <= mid && index2 <= right) {
if (arr[(int) index1] <= arr[(int) index2]) {
merged[(int) x++] = arr[(int) index1++];
} else {
merged[(int) x++] = arr[(int) index2++];
countInversions += (mid - index1 + 1);
}
}
while (index1 <= mid) {
merged[(int) x++] = arr[(int) index1++];
}
while (index2 <= right) {
merged[(int) x++] = arr[(int) index2++];
}
for (long i = 0, j = left; i < merged.length; i++, j++) {
arr[(int) j] = merged[(int) i];
}
return countInversions;
}
static long mergeSort(long arr[], long left, long right) {
long countInversions = 0;
if (left < right) {
long mid = left + (right - left) / 2;
countInversions += mergeSort(arr, left, mid);
countInversions += mergeSort(arr, mid + 1, right);
countInversions += merge(arr, left, mid, right);
}
return countInversions;
}
static long inversionCount(long arr[], long n) {
return mergeSort(arr, 0, n - 1);
}
}class Solution{
public:
long long int merge(long long arr[], long long left, long long mid, long long right)
{
long long merged[right-left+1];
long long index1 = left;
long long index2 = mid+1;
long long x = 0;
long long int countInversions = 0;
while(index1 <= mid && index2 <= right){
if(arr[index1] <= arr[index2]){
merged[x++] = arr[index1++];
}
else{
merged[x++] = arr[index2++];
countInversions += (mid - index1 + 1);
}
}
while(index1 <= mid){
merged[x++] = arr[index1++];
}
while(index2 <= right){
merged[x++] = arr[index2++];
}
long long len = sizeof(merged)/sizeof(merged[0]);
for(long long i=0,j=left;i<len;i++,j++){
arr[j] = merged[i];
}
return countInversions;
}
long long int mergeSort(long long arr[], long long left, long long right)
{
long long int countInversions = 0;
if(left < right){
int mid = left + (right-left)/2;
countInversions += mergeSort(arr, left, mid);
countInversions += mergeSort(arr, mid+1, right);
countInversions += merge(arr, left, mid, right);
}
return countInversions;
}
long long int inversionCount(long long arr[], long long n)
{
return mergeSort(arr, 0, n-1);
}
};class Solution:
def inversion_of_array(self, *args, **kwargs):
# Python implementation matching the optimal algorithm
pass/**
* Solution for Count Inversions
*/
function inversionOfArray(...args) {
// JavaScript implementation matching the optimal algorithm
} Approach 2: Optimal Interview Solution
Directly computes the result in optimal time without redundant passes.
Approach 2: Optimal Interview Solution Implementation
Approach 2: Optimal Interview Solution
class Solution {
static long merge(long arr[], long left, long mid, long right) {
long merged[] = new long[(int) (right - left + 1)];
long index1 = left;
long index2 = mid + 1;
long x = 0;
long countInversions = 0;
while (index1 <= mid && index2 <= right) {
if (arr[(int) index1] <= arr[(int) index2]) {
merged[(int) x++] = arr[(int) index1++];
} else {
merged[(int) x++] = arr[(int) index2++];
countInversions += (mid - index1 + 1);
}
}
while (index1 <= mid) {
merged[(int) x++] = arr[(int) index1++];
}
while (index2 <= right) {
merged[(int) x++] = arr[(int) index2++];
}
for (long i = 0, j = left; i < merged.length; i++, j++) {
arr[(int) j] = merged[(int) i];
}
return countInversions;
}
static long mergeSort(long arr[], long left, long right) {
long countInversions = 0;
if (left < right) {
long mid = left + (right - left) / 2;
countInversions += mergeSort(arr, left, mid);
countInversions += mergeSort(arr, mid + 1, right);
countInversions += merge(arr, left, mid, right);
}
return countInversions;
}
static long inversionCount(long arr[], long n) {
return mergeSort(arr, 0, n - 1);
}
}class Solution{
public:
long long int merge(long long arr[], long long left, long long mid, long long right)
{
long long merged[right-left+1];
long long index1 = left;
long long index2 = mid+1;
long long x = 0;
long long int countInversions = 0;
while(index1 <= mid && index2 <= right){
if(arr[index1] <= arr[index2]){
merged[x++] = arr[index1++];
}
else{
merged[x++] = arr[index2++];
countInversions += (mid - index1 + 1);
}
}
while(index1 <= mid){
merged[x++] = arr[index1++];
}
while(index2 <= right){
merged[x++] = arr[index2++];
}
long long len = sizeof(merged)/sizeof(merged[0]);
for(long long i=0,j=left;i<len;i++,j++){
arr[j] = merged[i];
}
return countInversions;
}
long long int mergeSort(long long arr[], long long left, long long right)
{
long long int countInversions = 0;
if(left < right){
int mid = left + (right-left)/2;
countInversions += mergeSort(arr, left, mid);
countInversions += mergeSort(arr, mid+1, right);
countInversions += merge(arr, left, mid, right);
}
return countInversions;
}
long long int inversionCount(long long arr[], long long n)
{
return mergeSort(arr, 0, n-1);
}
};class Solution:
def inversion_of_array(self, *args, **kwargs):
# Python implementation matching the optimal algorithm
pass/**
* Solution for Count Inversions
*/
function inversionOfArray(...args) {
// JavaScript implementation matching the optimal algorithm
} Edge Cases to Watch
- Empty or single-element input (n <= 1)
- Duplicates and boundary values near extrema
- Already sorted, reverse sorted, or uniform values
- Maximum constraint inputs to ensure no integer overflow or TLE
Master the Two Pointers Pattern
Study the core invariant, step-by-step decision framework, and common interview traps for the Two Pointers pattern.
How to Recognize This Pattern
- Common Array interview pattern
- Optimal time: O(nlogn)
Complexity Analysis
Time Complexity
O(nlogn)
Space Complexity
O(n)