每日一练:归并-交易逆序对的总数

LCR 170. 交易逆序对的总数 - 力扣(LeetCode)

题目要求:

在股票交易中,如果前一天的股价高于后一天的股价,则可以认为存在一个「交易逆序对」。请设计一个程序,输入一段时间内的股票交易记录 record,返回其中存在的「交易逆序对」总数。

示例 1:

复制代码
输入:record = [9, 7, 5, 4, 6]
输出:8
解释:交易中的逆序对为 (9, 7), (9, 5), (9, 4), (9, 6), (7, 5), (7, 4), (7, 6), (5, 4)。

限制:

0 <= record.length <= 50000

归并排序 O(NLogN):

把数组分成两份,先找左数组的所有逆序对,升序排序后,再找由数组的所有逆序对,升序排序后,最后找一左一右的逆序对。

假设一左一右:

存在record[cur1]>record[cur2],那么区间[cur1,mid]的元素都可以和record[cur2]构成逆序对。

cpp 复制代码
class Solution {
    vector<int> tmp; // 辅助数组
    int ret = 0;
    void _reversePairs(vector<int>& record, int sta, int end) {
        if (sta >= end)
            return;
        // 1、找中点划分数组
        int mid = sta + (end - sta) / 2;

        // 2、分别找左右两边的逆序对数
        _reversePairs(record, sta, mid);
        _reversePairs(record, mid + 1, end);

        // 3、排序两个数组+一左一右找逆序对
        int cur1 = sta, cur2 = mid + 1, i = 0;
        while (cur1 <= mid && cur2 <= end) {
            if(record[cur1]>record[cur2]){
                ret+=mid-cur1+1;
                tmp[i++]=record[cur2++];
            }else{
                tmp[i++]=record[cur1++];
            }
        }
        while(cur1 <= mid)
            tmp[i++]=record[cur1++];
        while(cur2 <= end)
            tmp[i++]=record[cur2++];

        // 4、将排序好的结果复制到record
        for(int i = sta;i <= end;i++){
            record[i]=tmp[i-sta];
        }
    }

public:
    int reversePairs(vector<int>& record) {
        tmp.resize(record.size());
        _reversePairs(record, 0, record.size() - 1);
        return ret;
    }
};
相关推荐
算AI18 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
懒羊羊大王&19 小时前
模版进阶(沉淀中)
c++
owde20 小时前
顺序容器 -list双向链表
数据结构·c++·链表·list
GalaxyPokemon20 小时前
Muduo网络库实现 [九] - EventLoopThread模块
linux·服务器·c++
W_chuanqi20 小时前
安装 Microsoft Visual C++ Build Tools
开发语言·c++·microsoft
hyshhhh20 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
tadus_zeng21 小时前
Windows C++ 排查死锁
c++·windows
EverestVIP21 小时前
VS中动态库(外部库)导出与使用
开发语言·c++·windows
杉之21 小时前
选择排序笔记
java·算法·排序算法
烂蜻蜓21 小时前
C 语言中的递归:概念、应用与实例解析
c语言·数据结构·算法