493. 翻转对
原始题目链接:https://leetcode.cn/problems/reverse-pairs/
给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。
你需要返回给定数组中的重要翻转对的数量。
示例 1:
输入: [1,3,2,3,1]
输出: 2
示例 2:
输入: [2,4,3,5,1]
输出: 3
注意:
给定数组的长度不会超过50000。
输入数组中的所有数字都在32位整数的表示范围内。
解题思路:
有序集合使用二分查找解题。
代码实现:
class Solution:
def reversePairs(self, nums: List[int]) -> int:
import bisect
reverse_double_nums = []
ans = 0
for num in reversed(nums):
# 保证reverse_double_nums是有序的,可以使用二分查找
# 在倒叙nums2倍元素数组中查找nums[i] > 2*nums[j]的元素的下标索引
# 那么在这个索引之前的所有元素都符合翻转对的要求,叠加数量就是当前遍历到的元素的解
ans += bisect.bisect_left(reverse_double_nums, num)
# 当前元素的2倍,加入到reverse_double_nums
double_num = num * 2
# 查找插入点
idx = bisect.bisect_left(reverse_double_nums, double_num)
# 插入元素
reverse_double_nums.insert(idx, double_num)
return ans
参考文献:
https://leetcode.cn/problems/reverse-pairs/solution/zui-jian-dan-yi-shi-xian-de-fang-fa-er-fen-cha-zha/