LeetCode 0493. Reverse Pairs Solution in Java, Python, C++, JavaScript, Go & Rust | Explanation + Code

CoderIndeed
0
0493. Reverse Pairs

Description

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

A 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

 

Constraints:

  • 1 <= nums.length <= 5 * 104
  • -231 <= nums[i] <= 231 - 1

Solutions

Solution 1

PythonJavaC++Go
class Solution: def reversePairs(self, nums: List[int]) -> int: def merge_sort(l, r): if l >= r: return 0 mid = (l + r) >> 1 ans = merge_sort(l, mid) + merge_sort(mid + 1, r) t = [] i, j = l, mid + 1 while i <= mid and j <= r: if nums[i] <= 2 * nums[j]: i += 1 else: ans += mid - i + 1 j += 1 i, j = l, mid + 1 while i <= mid and j <= r: if nums[i] <= nums[j]: t.append(nums[i]) i += 1 else: t.append(nums[j]) j += 1 t.extend(nums[i : mid + 1]) t.extend(nums[j : r + 1]) nums[l : r + 1] = t return ans return merge_sort(0, len(nums) - 1)(code-box)

Solution 2

PythonJavaC++Go
class BinaryIndexedTree: def __init__(self, n): self.n = n self.c = [0] * (n + 1) @staticmethod def lowbit(x): return x & -x def update(self, x, delta): while x <= self.n: self.c[x] += delta x += BinaryIndexedTree.lowbit(x) def query(self, x): s = 0 while x > 0: s += self.c[x] x -= BinaryIndexedTree.lowbit(x) return s class Solution: def reversePairs(self, nums: List[int]) -> int: s = set() for num in nums: s.add(num) s.add(num * 2) alls = sorted(s) m = {v: i for i, v in enumerate(alls, 1)} ans = 0 tree = BinaryIndexedTree(len(m)) for num in nums[::-1]: ans += tree.query(m[num] - 1) tree.update(m[num * 2], 1) return ans(code-box)

Solution 3

PythonJavaC++
class Node: def __init__(self): self.l = 0 self.r = 0 self.v = 0 class SegmentTree: def __init__(self, n): self.tr = [Node() for _ in range(4 * n)] self.build(1, 1, n) def build(self, u, l, r): self.tr[u].l = l self.tr[u].r = r if l == r: return mid = (l + r) >> 1 self.build(u << 1, l, mid) self.build(u << 1 | 1, mid + 1, r) def modify(self, u, x, v): if self.tr[u].l == x and self.tr[u].r == x: self.tr[u].v += 1 return mid = (self.tr[u].l + self.tr[u].r) >> 1 if x <= mid: self.modify(u << 1, x, v) else: self.modify(u << 1 | 1, x, v) self.pushup(u) def pushup(self, u): self.tr[u].v = self.tr[u << 1].v + self.tr[u << 1 | 1].v def query(self, u, l, r): if self.tr[u].l >= l and self.tr[u].r <= r: return self.tr[u].v mid = (self.tr[u].l + self.tr[u].r) >> 1 v = 0 if l <= mid: v += self.query(u << 1, l, r) if r > mid: v += self.query(u << 1 | 1, l, r) return v class Solution: def reversePairs(self, nums: List[int]) -> int: s = set() for num in nums: s.add(num) s.add(num * 2) alls = sorted(s) m = {v: i for i, v in enumerate(alls, 1)} tree = SegmentTree(len(m)) ans = 0 for v in nums[::-1]: x = m[v] ans += tree.query(1, 1, x - 1) tree.modify(1, m[v * 2], 1) return ans(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !