Reverse Pairs

hard array divide and conquer merge sort

Problem

Count pairs (i, j) with i < j and nums[i] > 2 · nums[j].

Inputnums = [1,3,2,3,1]
Output2
Sort each half; cross-half counting then a merge step.

def reverse_pairs(nums):
    def merge_sort(lo, hi):
        if lo >= hi: return 0
        mid = (lo + hi) // 2
        cnt = merge_sort(lo, mid) + merge_sort(mid+1, hi)
        j = mid + 1
        for i in range(lo, mid + 1):
            while j <= hi and nums[i] > 2 * nums[j]: j += 1
            cnt += j - (mid + 1)
        nums[lo:hi+1] = sorted(nums[lo:hi+1])
        return cnt
    return merge_sort(0, len(nums) - 1)
function reversePairs(nums) {
  function ms(lo, hi) {
    if (lo >= hi) return 0;
    const mid = (lo + hi) >> 1;
    let cnt = ms(lo, mid) + ms(mid + 1, hi);
    let j = mid + 1;
    for (let i = lo; i <= mid; i++) {
      while (j <= hi && nums[i] > 2 * nums[j]) j++;
      cnt += j - (mid + 1);
    }
    const merged = nums.slice(lo, hi + 1).sort((a, b) => a - b);
    for (let k = 0; k < merged.length; k++) nums[lo + k] = merged[k];
    return cnt;
  }
  return ms(0, nums.length - 1);
}
class Solution {
    public int reversePairs(int[] nums) { return ms(nums, 0, nums.length - 1); }
    int ms(int[] a, int lo, int hi) {
        if (lo >= hi) return 0;
        int mid = (lo + hi) >>> 1;
        int cnt = ms(a, lo, mid) + ms(a, mid + 1, hi);
        int j = mid + 1;
        for (int i = lo; i <= mid; i++) {
            while (j <= hi && a[i] > 2L * a[j]) j++;
            cnt += j - (mid + 1);
        }
        int[] tmp = Arrays.copyOfRange(a, lo, hi + 1);
        Arrays.sort(tmp);
        for (int k = 0; k < tmp.length; k++) a[lo + k] = tmp[k];
        return cnt;
    }
}
int ms(vector& a, int lo, int hi) {
    if (lo >= hi) return 0;
    int mid = (lo + hi) / 2;
    int cnt = ms(a, lo, mid) + ms(a, mid + 1, hi);
    int j = mid + 1;
    for (int i = lo; i <= mid; i++) {
        while (j <= hi && (long long)a[i] > 2LL * a[j]) j++;
        cnt += j - (mid + 1);
    }
    sort(a.begin() + lo, a.begin() + hi + 1);
    return cnt;
}
int reversePairs(vector& nums) { return ms(nums, 0, nums.size() - 1); }
Time: O(n log² n) Space: O(n)