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

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;
    }
};
相关推荐
workflower23 分钟前
微软PM的来历
java·开发语言·算法·microsoft·django·结对编程
惊讶的猫24 分钟前
c++基础
开发语言·c++
JianminZheng3 小时前
MTPA算法原理及仿真验证
算法
im_AMBER4 小时前
Leetcode 38
笔记·学习·算法·leetcode
Miraitowa_cheems4 小时前
LeetCode算法日记 - Day 82: 环形子数组的最大和
java·数据结构·算法·leetcode·决策树·线性回归·深度优先
Code_Shark5 小时前
AtCoder Beginner Contest 426 题解
数据结构·c++·算法·数学建模·青少年编程
仰泳的熊猫5 小时前
LeetCode:698. 划分为k个相等的子集
数据结构·c++·算法·leetcode
豐儀麟阁贵5 小时前
4.5数组排序算法
java·开发语言·数据结构·算法·排序算法
xlq223225 小时前
7(内存管理)(上)(了解)
c++
Shinom1ya_5 小时前
算法 day 32
算法