首页 > 其他分享 >LCR 170. 交易逆序对的总数

LCR 170. 交易逆序对的总数

时间:2024-12-23 18:30:56浏览次数:4  
标签:right LCR temp int record 逆序 left 170

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

思路

方法一:嵌套 for (超时)

class Solution {
    public int reversePairs(int[] record) {
        int total = 0;
        for(int i = 0; i < record.length; i++) {
            for(int j = i + 1; j < record.length; j++){
                if(record[i] > record[j]){
                    total++;
                }
            }
        }
        return total;
    }
}

方法二:归并排序

这里在归并的过程中统计逆序对的正确性在于:对于A(在左半部分)、B(在右半部分)两个升序数组合并的过程中,当A中的某一个元素a和B中的某一个元素b比较时,如果确定a比b大,那么A中在a之后的元素的都比b大,也就是说,A中在a之后的元素以及a和b均构成了逆序对。

class Solution {
    public int reversePairs(int[] record) {
        if (record == null || record.length < 2) {
            return 0;
        }
        int n = record.length;
        int[] temp = new int[n];
        return mergeSort(record, temp, 0, n - 1);
    }
    
    // 归并排序入口
    private int mergeSort(int[] record, int[] temp, int left, int right) {
        if (left < right) {
            int mid = left + (right - left) / 2;
            int count = mergeSort(record, temp, left, mid) + mergeSort(record, temp, mid + 1, right);
            count += merge(record, temp, left, mid, right);
            return count;
        } else {
            return 0;
        }
    }

    // 双指针合并两个有序数组,并计算逆序对数量
    private int merge(int[] record, int[] temp, int left, int mid, int right) {
        int count = 0;
        int P1 = left;
        int P2 = mid + 1;
        int k = 0;
        while (P1 <= mid && P2 <= right) {
            if (record[P1] <= record[P2]) {
                temp[k++] = record[P1++];
            } else {
                temp[k++] = record[P2++];
                count += (mid - P1 + 1); // 计算逆序对数量
            }
        }
        while (P1 <= mid) {
            temp[k++] = record[P1++];
        }
        while (P2 <= right) {
            temp[k++] = record[P2++];
        }
        for (int i = left; i <= right; i++) {
            record[i] = temp[i - left];
        }
        return count;
    }
}

标签:right,LCR,temp,int,record,逆序,left,170
From: https://www.cnblogs.com/drunkerl/p/18624750

相关文章

  • 剑指Offer|LCR 012. 寻找数组的中心下标
    LCR012.寻找数组的中心下标给你一个整数数组nums,请计算数组的中心下标。数组中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。如果中心下标位于数组最左端,那么左侧数之和视为0,因为在下标的左侧不存在元素。这一点对于中心下标位于数......
  • 信息学奥赛一本通:1170:计算2的N次方
    【题目描述】任意给定一个正整数N(N<=100),计算2的n次方的值。【输入】输入一个正整数N。【输出】输出2的N次方的值。【输入样例】5【输出样例】32【参考程序一】(1)数据的接收方法和存贮方法       数据的接收和存贮:当输入的数很长时,可采用字符......
  • LCR 164. 破解闯关密码
    破解闯关密码闯关游戏需要破解一组密码,闯关组给出的有关密码的线索是:一个拥有密码所有元素的非负整数数组password密码是password中所有元素拼接后得到的最小的一个数请编写一个程序返回这个密码。示例1:输入:password=[15,8,7]输出:"1578"示例2:输入:pas......
  • 2024-12-18 17 55 记录 Cambly trip`s summary and wher 1607b517085581159d14fe77503
    2024-12-1817:55记录Camblytrip`ssummaryandwhereisthenext?https://tingwu.aliyun.com/doc/transcripts/g2y8qevxaayxnbeo?sl=1#《2024-12-1817:55记录Camblytrip`ssummaryandwhereisthenext?》1.全文摘要对话讲述了一个人通过使用美好的旅行来学......
  • Android version has disappeared from Google Play #1700
     IfyouspeakRussian,4pdahasacustom'improvedversion'thatisprobablywhatyouneed.Ican'tlinktoithere,butsomesearchingshouldhelp.Atleastuntilitisopensourced/broughtbacktoanappstore.  Here’stheanswerI......
  • 题海拾贝:LCR018.验证回文串
               Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路!我的博客:<但凡.我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》欢迎点赞,关注!1、题目2、2、题解         这个题如果没有空格和符号的话,那就直接双指......
  • SVN 报错 | svn: E170004: Commit failed (details follow): svn: E170004: Directory
    问题描述IDEA中通过SVN拉取项目后进行修改,第一次commit提交代码的时候成功提交,第二次修改后再提交的时候报错了,提示“Directory'xxx'isoutofdate”解决方法报错的原因是本地项目过时了,和svn服务器的项目版本不一致。需要先update更新本地的项目,再重新修改代码然......
  • 7-10 sdut- C语言实验-数组逆序(数组移位)
    7-10sdut-C语言实验-数组逆序(数组移位)分数13全屏浏览切换布局作者 马新娟单位 山东理工大学有n个整数,使其最后m个数变成最前面的m个数,其他各数顺序向后移m(m<n<100)个位置。输入格式:输入数据有2行,第一行的第一个数为n,后面是n个整数,第二行整数m。输出格式:......
  • P1708 [入门赛 #21] 星云 hard ver. 题解
    思路看到此题,第一想到可以直接枚举,求一个数的数位之和,然后判断,可以就让方案数加一,代码如下:#include<bits/stdc++.h>usingnamespacestd;intmain(){intt;cin>>t;intn,k,cnt=0,ans;while(t--){cin>>n>>k;cnt=0;for(inti=1;......
  • LCR 048. 二叉树的序列化与反序列化(困难)(主站297)
    https://leetcode.cn/problems/h54YBf/https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/难度:☆☆☆题目:序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另......