【归并】Leetcode 交易逆序对的总数

题目讲解

LCR 170. 交易逆序对的总数


算法讲解

还是使用分治算法的思想:我们可以先将数组分成两块,先求出左边部分的逆序对,右边部分的逆序对和一左一右的逆序对,三个数量相加就是当前数组中的所有逆序对;其次我们在求子数组逆序对的时候,可以把排序添加上,如果添加上排序,那么求左右部分的逆序对的时候就会很方便,只需要将下标相减即可

cpp 复制代码
class Solution {
    int temp[50002];
public:
    int reversePairs(vector<int>& record) {
        return Merge(record, 0 , record.size() - 1);
    }

    int Merge(vector<int>& nums, int left, int right)
    {
        int ret = 0;
        if(left >= right)return ret;
        int mid = left + (right - left) / 2;
        ret += Merge(nums, left, mid);
        ret += Merge(nums, mid+1, right);
        
        //处理一左一右 + 合并有序数组  升序
        int i = 0, cur1 = left, cur2 = mid+1;
        while(cur1 <= mid && cur2 <= right)
        {
            if(nums[cur1] <= nums[cur2])temp[i++] = nums[cur1++];
            else
            {
                ret += mid - cur1 + 1;
                temp[i++] = nums[cur2++];
            }
        }

        //处理cur指针没有结束的数组
        while(cur1 <= mid)temp[i++] = nums[cur1++];
        while(cur2 <= right)temp[i++] = nums[cur2++];

        //填充原来的数组
        for(int k = left; k <= right; k++)
        {
            nums[k] = temp[k - left];
        }
        return ret;
    }
};
相关推荐
2zcode3 分钟前
基于MATLAB语音信号变声算法设计与实现
算法·matlab·语音识别·变声算法
满怀冰雪11 分钟前
第14篇-队列与单调队列-解决窗口最值问题的关键结构
java·算法
QiLinkOS13 分钟前
极客精神与商业思维的融合实践(3)
c语言·c++·人工智能·算法·开源协议
bIo7lyA8v15 分钟前
算法设计中的代价函数优化与约束求解的技术8
算法
暖阳华笺18 分钟前
【数据结构与算法】哈希专题
数据结构·c++·算法·leetcode·哈希算法
ceclar12319 分钟前
C#字节流与字符流
算法·c#·.net
大白话_NOI24 分钟前
【洛谷 P1024 】[NOIP2001 提高组] 一元三次方程求解 - 详细分析与C++实现
c++·算法
Matthew_zhu_25 分钟前
P3374 【模板】树状数组 1 题解
算法
随意起个昵称25 分钟前
区间dp-进阶题目1(进阶合并)
c++·算法·动态规划
伶俜6626 分钟前
鸿蒙原生应用实战(四)ArkUI 语音变声器:录音 + 4 种音效 + 音调变换算法
算法·华为·harmonyos