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

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;
    }
};
相关推荐
liuyao_xianhui35 分钟前
优选算法_最小基因变化_bfs_C++
java·开发语言·数据结构·c++·算法·哈希算法·宽度优先
黎阳之光1 小时前
数智技术如何赋能空天地一体化,领跑低空经济新赛道
大数据·人工智能·算法·安全·数字孪生
cch89181 小时前
易语言与C++:编程语言终极对决
开发语言·c++
HABuo1 小时前
【linux线程(三)】生产者消费者模型(条件变量阻塞队列版本、信号量环形队列版本)详细剖析
linux·运维·服务器·c语言·c++·ubuntu·centos
小肝一下1 小时前
每日两道力扣,day2
c++·算法·leetcode·职场和发展
漂流瓶jz2 小时前
UVA-11846 找座位 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·排序算法·深度优先·aoapc·算法竞赛入门经典·uva
米粒12 小时前
力扣算法刷题 Day 31 (贪心总结)
算法·leetcode·职场和发展
少许极端2 小时前
算法奇妙屋(四十)-贪心算法学习之路7
java·学习·算法·贪心算法
AlenTech3 小时前
647. 回文子串 - 力扣(LeetCode)
算法·leetcode·职场和发展
py有趣3 小时前
力扣热门100题之合并两个有序链表
算法·leetcode·链表