493. Reverse Pairs
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
解法
使用归并排序,合并之前先统计满足条件的 important reverse pair 的数量。
class Solution:
def reversePairs(self, nums):
self.pairs = 0
def merge_sort(nums):
if len(nums) < 2:
return nums
mid = len(nums) // 2
left = merge_sort(nums[:mid])
right = merge_sort(nums[mid:])
return merge(left, right)
def merge(left, right):
j = 0
for num in left:
while j < len(right) and num > 2 * right[j]:
j += 1
self.pairs += j
return sorted(left + right)
merge_sort(nums)
return self.pairs
核心是 merge
中统计的过程,例如 left = [4, 9, 16, 32], right = [1, 2, 3, 4]
。对应的 j 的值分别为 1, 4, 4, 4。总计为 13。
小结
归并排序思想的使用,还有一个常见的场景是统计逆序对的数量。
引用
General principles behind problems similar to "Reverse Pairs"
Last updated
Was this helpful?