Leetcode 493.翻轉對
1 題目描述(Leetcode題目鏈接)
給定一個數組 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我們就將 (i, j) 稱作一個重要翻轉對。
你需要返回給定數組中的重要翻轉對的數量。
輸入: [1,3,2,3,1]
輸出: 2
輸入: [2,4,3,5,1]
輸出: 3
2 題解
比較標準的分治寫法。
class Solution:
def reversePairs(self, nums: List[int]) -> int:
if not nums:
return 0
res,_ = self.divideAndconquer(nums)
return res
def divideAndconquer(self, nums):
if len(nums) == 1:
return 0, nums
l, left = self.divideAndconquer(nums[:len(nums)//2])
r, right = self.divideAndconquer(nums[len(nums)//2:])
res = l + r
for i in range(len(left)): # 這裏用一個二分查找
m, n = 0, len(right)
while m < n:
mid = (m + n)//2
if left[i] > 2*right[mid]:
m = mid + 1
else:
n = mid
res += m
return res, sorted(left + right)
直接二分法。
class Solution:
def reversePairs(self, nums: List[int]) -> int:
import bisect, sys
arr = []
res = 0
for num in nums:
res += len(arr) - bisect.bisect_right(arr, num * 2)
loc = bisect.bisect_right(arr, num)
arr[loc:loc] = [num]
return res