【LCR 170. 交易逆序对的总数】

目录

一、题目描述

二、算法原理

三、代码实现

3.1升序:

cpp 复制代码
class Solution 
{
public:

    int mergeSort(vector<int>& nums, int left, int right)
    {
        if (left >= right)
        {
            return 0;
        }
        int mid = left + (right - left) / 2, ret = 0;
        ret += mergeSort(nums, left, mid);
        ret += mergeSort(nums, mid + 1, right);

        //求一左一右
        vector<int> temp(right - left + 1);
        int cur1 = left, cur2 = mid + 1, i = 0;
        while (cur1 <= mid && cur2 <= right)
        {
            if (nums[cur1] <= nums[cur2])
            {
                temp[i++] = nums[cur1++];
            }
            else
            {
                ret += (mid - cur1 + 1);
                temp[i++] = nums[cur2++];       
            }
        }

        while (cur1 <= mid) temp[i++] = nums[cur1++];
        while (cur2 <= right) temp[i++] = nums[cur2++];
        for (int i = left; i <= right; i++)
        {
            nums[i] = temp[i - left];
        }
        return ret;
    }



    int reversePairs(vector<int>& record) 
    {
        return mergeSort(record,0,record.size()-1);
    }
};

3.2降序:

cpp 复制代码
class Solution 
{
public:

    int mergeSort(vector<int>& nums, int left, int right)
    {
        if (left >= right)
        {
            return 0;
        }
        int mid = left + (right - left) / 2, ret = 0;
        ret += mergeSort(nums, left, mid);
        ret += mergeSort(nums, mid + 1, right);

        //求一左一右
        vector<int> temp(right - left + 1);
        int cur1 = left, cur2 = mid + 1, i = 0;
        while (cur1 <= mid && cur2 <= right)
        {
            if (nums[cur1] <= nums[cur2])
            {
                temp[i++] = nums[cur2++];
            }
            else
            {
                ret += (right-cur2+1);
                temp[i++] = nums[cur1++];       
            }
        }

        while (cur1 <= mid) temp[i++] = nums[cur1++];
        while (cur2 <= right) temp[i++] = nums[cur2++];
        for (int i = left; i <= right; i++)
        {
            nums[i] = temp[i - left];
        }
        return ret;
    }



    int reversePairs(vector<int>& record) 
    {
        return mergeSort(record,0,record.size()-1);
    }
};
相关推荐
雾岛听蓝2 分钟前
C++ 入门核心知识点(从 C 过渡到 C++ 基础)
开发语言·c++·经验分享·visual studio
AGI前沿13 分钟前
AdamW的继任者?AdamHD让LLM训练提速15%,性能提升4.7%,显存再省30%
人工智能·算法·语言模型·aigc
Tan_Ying_Y15 分钟前
什么是垃圾回收算法 他的底层原理是什么?
算法
Xの哲學28 分钟前
Linux 分区表深度技术剖析
linux·网络·算法·架构·边缘计算
写写闲篇儿35 分钟前
经典算法题剖析之传递信息(三)
算法
上不如老下不如小37 分钟前
2025年第七届全国高校计算机能力挑战赛初赛 Python组 编程题汇总
开发语言·python·算法
xlq223221 小时前
19.模版进阶(上)
c++
yuuki2332331 小时前
【C++】初识C++基础
c语言·c++·后端
小年糕是糕手1 小时前
【C++】类和对象(二) -- 构造函数、析构函数
java·c语言·开发语言·数据结构·c++·算法·leetcode
玫瑰花店1 小时前
SomeIP报文详解
c++·someip