剑指 Offer 51. 数组中的逆序对

这篇博客详细介绍了如何运用归并排序算法来计算一个整数数组中的逆序对数量。通过递归地将数组分为两部分,然后合并过程中比较元素,博主展示了如何在已排序的子序列中有效地找出逆序对。代码实现清晰,易于理解,适用于对算法和数据结构感兴趣的读者。

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

### 解题思路

利用归并排序算法:

由于用于归并的两个序列是已序的,所以在进行两辆比对时,序列A中的一个数大于序列B中的一个数,那么序列A中这个数的后面所有数都大于这个数

### 代码

class Solution {
public:
    int res = 0;
    vector<int> temp;
    int mergeSort(vector<int>& nums,int l,int r){
        if(l >= r) return 0;
        int mid = (l + r) >> 1;
        int t1 = mergeSort(nums,l,mid);
        int t2 = mergeSort(nums,mid+1,r);
        int p1 = l,p2 = mid+1,k=0;
        int t3 = 0;
        while(p1 <= mid && p2 <= r){
            if(nums[p1] > nums[p2]){
                temp[k++] = nums[p2++];
                t3 += mid-p1+1;
            }
            else temp[k++] = nums[p1++];
        }
        while(p1 <= mid) temp[k++] = nums[p1++];
        while(p2 <= r) temp[k++] = nums[p2++];
        for(int i = l,j=0;i <= r;i++,j++) nums[i] = temp[j];
        return t1 + t2 + t3;
    }
    int reversePairs(vector<int>& nums) {
        temp = vector<int>(nums.size(),0);
        int res = mergeSort(nums,0,nums.size()-1);
        return res;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值