[LeetCode] LCR170. 交易逆序对的总数

题目描述:

在股票交易中,如果前一天的股价高于后一天的股价,则可以认为存在一个「交易逆序对」。请设计一个程序,输入一段时间内的股票交易记录 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

题目链接:

. - 力扣(LeetCode)

题目主要思路:

其实就是归并分治的思想,以排升序为例,假如当cur1 > cur2 时,因为左右分区是排升序的,因此cur1以及cur1后面的部分一定是比cur2大的,因此{[cur1,mid], cur2}是一定构成逆序对的。

解题代码:

class Solution {
    int tmp[50000];
public:
    int reversePairs(vector<int>& record) {
        return mergeSort(record, 0, record.size()-1);
    }
    int mergeSort(vector<int>& record, int left, int right)
    {
        // 递归结束条件
        if (left >= right) return 0;
        int mid = (left + right) >> 1;
        int ret = 0;
        ret += mergeSort(record, left, mid);
        ret += mergeSort(record, mid+1, right);
        int cur1 = left, cur2 = mid+1, i = 0;
        while (cur1 <= mid && cur2 <= right) 
        {
            // 升序
            if (record[cur1] <= record[cur2])
            {
                tmp[i++] = record[cur1++];
            }
            else
            {
                ret += mid - cur1 + 1;
                tmp[i++] = record[cur2++];
            }
        }
        // 处理为排序的数据
        while (cur1 <= mid) 
        {
            tmp[i++] = record[cur1++];
        }
        while (cur2 <= right) 
        {
            tmp[i++] = record[cur2++];
        }
        // 将数据写入record中
        for (int i = left; i <= right; ++i)
        {
            record[i] = tmp[i-left];
        }
        // 返回ret结果给上一层
        return ret;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

福楠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值