【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);
    }
};
相关推荐
z落落15 小时前
C#参数区别
java·算法·c#
思麟呀15 小时前
C++工业级日志项目(六)异步日志器
linux·c++·windows
c2385615 小时前
vector(下)
数据结构·算法
z落落15 小时前
C# 冒泡排序+选择排序 + Array.Sort 自定义排序
数据结构·算法
wyy1851007372815 小时前
双路并行:一套匹配算法如何解决中文制单的两大核心难题
算法·ai·crm·crm系统
s_w.h16 小时前
【 linux 】文件系统
linux·运维·服务器·算法·bash
PAK向日葵16 小时前
从零实现 Python 虚拟机(二):S.A.A.U.S.O 的总体架构设计
c++·python
无限进步_16 小时前
【C++】weak_ptr、循环引用与线程安全
开发语言·数据结构·c++·算法·安全
罗超驿16 小时前
9.LeetCode 209. 长度最小的子数组 | 滑动窗口专题详解
java·算法·leetcode·面试
水蓝烟雨16 小时前
0135. 分发糖果
算法·leetcode