Leetcode 493.翻轉對(Reverse Pairs)

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章