Reverse Pairs LeetCode Solution

Last updated on January 17th, 2025 at 01:09 am

Here, we see a Reverse Pairs LeetCode Solution. This Leetcode problem is solved using different approaches in many programming languages, such as C++, Java, JavaScript, Python, etc.

List of all LeetCode Solution

Topics

Binary Indexed Tree, Binary Search, Divide-and-Conquer, Segment Tree, Sort

Companies

Google

Level of Question

Hard

Reverse Pairs LeetCode Solution

Reverse Pairs LeetCode Solution

1. Problem Statement

Given an integer array nums, return the number of reverse pairs in the array.

reverse pair is a pair (i, j) where:

  • 0 <= i < j < nums.length and
  • nums[i] > 2 * nums[j].

Example 1:
Input: nums = [1,3,2,3,1]
Output: 2
Explanation: The reverse pairs are: (1, 4) –> nums[1] = 3, nums[4] = 1, 3 > 2 * 1 (3, 4) –> nums[3] = 3, nums[4] = 1, 3 > 2 * 1

Example 2:
Input: nums = [2,4,3,5,1]
Output: 3
Explanation: The reverse pairs are: (1, 4) –> nums[1] = 4, nums[4] = 1, 4 > 2 * 1 (2, 4) –> nums[2] = 3, nums[4] = 1, 3 > 2 * 1 (3, 4) –> nums[3] = 5, nums[4] = 1, 5 > 2 * 1

2. Coding Pattern Used in Solution

The coding pattern used in the provided code is “Merge Sort with Modification”. This is a variation of the Divide and Conquer approach, where the array is recursively divided into smaller subarrays, and during the merge step, the condition for counting reverse pairs is checked.

3. Code Implementation in Different Languages

3.1 Reverse Pairs C++

class Solution {
public:
    int reversePairs(vector<int>& nums) {
         int n = nums.size();
        long long reversePairsCount = 0;
        for(int i=0; i<n-1; i++){
            for(int j=i+1; j<n; j++){
                if(nums[i] > 2*(long long)nums[j]){
                    reversePairsCount++;
                }
            }
        }
        return reversePairsCount;       
    }
};

3.2 Reverse Pairs Java

class Solution {
    int count;
    public int reversePairs(int[] nums) {
        count = 0;
        merger(nums,0,nums.length-1);

        return count;
    }
    private ArrayList<Integer> merge(ArrayList<Integer> left,ArrayList<Integer> right){
        ArrayList<Integer> ans = new ArrayList<>();
        int i = 0;
        int j = 0;
        while(i < left.size() && j < right.size()){
            if (left.get(i) >right.get(j)){
                ans.add(right.get(j));
                j++;
            }
            else {
                ans.add(left.get(i));
                i++;
            }
        }
        if ( i < left.size()){
            while (i <left.size())
             ans.add(left.get(i++));
        }
        if(j < right.size()){
            while (j < right.size())
             ans.add(right.get(j++));
        }
        return ans;
    }
    private void helper(ArrayList<Integer> left,ArrayList<Integer> right){
        int i = 0;
        int j = 0;
        while (i < left.size() && j < right.size()){
            if(left.get(i) > 2*(long)right.get(j)){
                count += left.size() - i;
                j++;
            }
            else
            i++;
        }
        
    }
    private ArrayList<Integer> merger(int[] nums,int start,int end){
        if(start == end){
            ArrayList<Integer> temp = new ArrayList<>();
            temp.add(nums[start]);
            return temp;
        }
        int mid = (start + end)/2;
        ArrayList<Integer> left = merger(nums,start,mid);
        ArrayList<Integer> right = merger(nums,mid+1,end);
        helper(left,right);
        
        return merge(left,right);

    }
}

3.3 Reverse Pairs JavaScript

var reversePairs = function(nums) {
    let count = 0;
    
    const mergeSort = (nums, low, high) => {
        if (low < high) {
            const mid = Math.floor((low + high) / 2);
            mergeSort(nums, low, mid);
            mergeSort(nums, mid + 1, high);
            count += merge(nums, low, mid, high);
        }
    };
    
    const merge = (nums, low, mid, high) => {
        let count = 0;
        const temp = [];
        let i = low;
        let j = mid + 1;
        while (i <= mid && j <= high) {
            if (nums[i] <= 2 * nums[j]) {
                i++;
            } else {
                count += mid - i + 1;
                j++;
            }
        }
        i = low;
        j = mid + 1;
        while (i <= mid && j <= high) {
            if (nums[i] <= nums[j]) {
                temp.push(nums[i]);
                i++;
            } else {
                temp.push(nums[j]);
                j++;
            }
        }
        while (i <= mid) {
            temp.push(nums[i]);
            i++;
        }
        while (j <= high) {
            temp.push(nums[j]);
            j++;
        }
        for (let k = 0; k < temp.length; k++) {
            nums[low + k] = temp[k];
        }
        return count;
    };
    mergeSort(nums, 0, nums.length - 1);
    return count;
};

3.4 Reverse Pairs Python

class Solution(object):
    def reversePairs(self, nums):
        def merge_sort(start, end):
            if start >= end:
                return 0
            mid = (start + end) // 2
            count = merge_sort(start, mid) + merge_sort(mid + 1, end)
            i = start
            j = mid + 1
            while i <= mid and j <= end:
                if nums[i] > 2 * nums[j]:
                    count += mid - i + 1
                    j += 1
                else:
                    i += 1
            nums[start:end + 1] = sorted(nums[start:end + 1])
            return count
        return merge_sort(0, len(nums) - 1)

4. Time and Space Complexity

Time ComplexitySpace Complexity
C++O(n²)O(1)
JavaO(n log n)O(n)
JavaScriptO(n log n)O(n)
PythonO(n log n)O(n)
  • The C++ code is a brute-force solution with O(n²) time complexity.
  • While the Java, JavaScript, and Python implementations use a more efficient O(n log n) approach with a modified merge sort.
  • All implementations (except C++) require O(n) additional space for temporary arrays or lists.
Scroll to Top