Leetcode 每日一题——493. 翻转对

本文介绍了一种解决493.翻转对问题的方法,通过使用归并排序来统计数组中满足特定条件的重要翻转对数量。文中提供了详细的C++及Python实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

493. 翻转对

给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。

你需要返回给定数组中的重要翻转对的数量。
在这里插入图片描述
该题类似于逆序对个数的查找,使用归并排序进行求解,具体代码如下:

class Solution {
public:
    int reversePairsRecursive(vector<int>& nums,int left, int right)
    {
        if (left==right) return 0;
        int res=0;
        int mid=(left+right)/2;
        res+=reversePairsRecursive(nums,left,mid);
        res+=reversePairsRecursive(nums,mid+1,right);
        
        int i=left;
        int j=mid+1;
        while(i<=mid)
        {
            while(j<=right && (long long)nums[i]>2*(long long)nums[j]) j++;
            res+=(j-mid-1);
            i++;
        }
        vector<int> sorted(right-left+1);
        int pleft=left;
        int prigt=mid+1;
        int psort=0;
        while(pleft<=mid || prigt<=right)
        {
            if(pleft>mid)
            {
                sorted[psort++]=nums[prigt++];
            }
            else if(prigt>right)
            {
                sorted[psort++]=nums[pleft++];
            }
            else
            {
                if(nums[pleft]>nums[prigt]) sorted[psort++]=nums[prigt++];
                else sorted[psort++]=nums[pleft++];
            }
        }
        for (int k=0;k<sorted.size();k++) nums[left+k]=sorted[k];
        return res;
    }
    int reversePairs(vector<int>& nums) {
        if (!nums.size()) return 0;
        return reversePairsRecursive(nums,0,nums.size()-1);

    }
};

运行效果:
在这里插入图片描述
类似的思路Python代码:

class Solution:
    def reversePairs(self, nums: List[int]) -> int:
        def reverseSort(left,right):
            if left is right:return 0
            res=0
            mid=int((left+right)/2)
            res+=reverseSort(left,mid)
            res+=reverseSort(mid+1,right)
            i=left
            j=mid+1
            while(i<=mid):
                while(j<=right and nums[i]>2*nums[j]): 
                    j+=1
                res+=(j-mid-1)
                i+=1
            sortList=[0 for _ in range(right-left+1)]
            pleft,pright,psort=left,mid+1,0
            while(pleft<=mid or pright<=right):
                if(pleft>mid):
                        sortList[psort]=nums[pright] 
                        psort+=1
                        pright+=1
                        
                elif(pright>right):
                    sortList[psort]=nums[pleft]
                    psort+=1
                    pleft+=1
                else:
                    if nums[pleft]>nums[pright]:
                        sortList[psort]=nums[pright] 
                        psort+=1
                        pright+=1
                    else:
                        sortList[psort]=nums[pleft]
                        psort+=1
                        pleft+=1  
            
            for i in range(len(sortList)):
                nums[left+i] = sortList[i]
            return res
        if(not len(nums)): return 0
       
        return reverseSort(0,len(nums)-1)

来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-pairs

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值