Given an array nums
, we call (i, j)
an important reverse pair if i < j
and nums[i] > 2*nums[j]
.
You need to return the number of important reverse pairs in the given array.
Example1:
Input: [1,3,2,3,1] Output: 2
Example2:
Input: [2,4,3,5,1] Output: 3
Note:
- The length of the given array will not exceed
50,000
. - All the numbers in the input array are in the range of 32-bit integer.
# Solution 1: Using Binary Index Tree, which has O(nlogn) time complexity. class BIT(): def __init__(self, n): self.n = n + 1 self.sums = [0] * self.n def update(self, i, delta): while i < self.n: self.sums[i] += delta i += i & (-i) def query(self, i): res = 0 while i > 0: res += self.sums[i] i -= i & (-i) return res class Solution: def reversePairs(self, nums: List[int]) -> int: sorted_nums = sorted(list(set(nums + [x * 2 for x in nums]))) tree = BIT(len(sorted_nums)) res = 0 ranks = {} for i, n in enumerate(sorted_nums): ranks[n] = i + 1 for n in nums[::-1]: res += tree.query(ranks[n] - 1) tree.update(ranks[n * 2], 1) return res
# Solution 2: At this time, we are going to use bisect. Got inspiration from Merge Sort (Divide and Conquer). class Solution: def reversePairs(self, nums: List[int]) -> int: ranks = list() ans = 0 for n in reverse(nums): ans += bisect.bisect_left(ranks, n) bisect.insort_left(ranks, n * 2) return ans