交易逆序对的总数

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

LCR 170. 交易逆序对的总数的更多相关文章

  1. 剑指offer-第五章优化时间和空间效率(数组中的逆序对的总数)

    题目:在数组中如果两个数字的前面的数比后面的数大,则称为一对逆序对.输入一个数组求出数组中逆序对的总数. 以空间换时间:思路:借助一个辅助数组,将原来的数组复制到该数组中.然后将该数组分成子数组,然后 ...

  2. 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007

    include "stdafx.h" #include<iostream> #include<vector> #include <algorithm& ...

  3. 剑指offer系列61---数组中的逆序对

    [题目]在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. * [思路]运用归并排序的思想. * 首先将数组分成两个子数组,统 ...

  4. [剑指OFFER] 数组中的逆序对

    题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数.     分析:利用归并排序的思想,分成2部分,每一部分按照从大到 ...

  5. lintcode:逆序对

    题目 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.给你一个数组,求出这个数组中逆序对的总数.概括:如果a[i] > a[j] 且 i < j, a[i] ...

  6. (剑指Offer)面试题36:数组中的逆序对

    题目: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 思路: 1.顺序扫描 顺序扫描整个数组,每扫描到一个数字,就将该数 ...

  7. 【剑指offer】求逆序对的个数

    2013-09-07 10:50:31 面试题36:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字构成一个逆序对.输入一个数组,求出这个数组中逆序对的总数. 小结: 最直观的的方法是: ...

  8. 九度OJ 1348 数组中的逆序对 -- 归并排序

    题目地址:http://ac.jobdu.com/problem.php?pid=1348 题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求 ...

  9. 【剑指offer】面试题36:数组中的逆序对

    题目: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 思路: 归并排序的合并过程.主要是考虑合并两个有序序列时,计算逆序 ...

  10. 【剑指Offer学习】【面试题36:数组中的逆序对】

    题目:在数组中的两个数字假设前面一个数字大于后面的数字.则这两个数字组成一个逆序对.输入一个数组.求出这个数组中的逆序对的总数. 举例分析 比如在数组{7, 5, 6, 4 中, 一共存在5 个逆序对 ...

随机推荐

  1. 使用netsh命令行进行网络管理

    显示网络适配器状态 netsh interface show interface 显示各个网络适配器的名称和状态 启用(禁用)网络适配器 本系列命令需要以"以管理员身份运行". 禁 ...

  2. python操作pptx设置title字体大小插入全屏图片A4尺寸实例一枚

    pip install python-pptx 安装好pptx,设置标题最大的作用是ppt里面的摘要视图显示摘要文字 参考:https://python-pptx.readthedocs.io/en/ ...

  3. 重温c语言之,7天开整,就是随便的写写,第一天

    一:转义字符 \t是一个字符,在printf里面,只占一个位置: 其他什么的抽象字符,用一个'\'+抽象字符就可以出现: \ddd这个是8进制的,可以转成10进制的,之后参考ASCLL码表即可 二:枚 ...

  4. 『玩转Streamlit』--交互类组件

    交互类组件在Web应用程序中至关重要,它们允许用户与应用进行实时互动,能够显著提升用户体验. 用户不再只是被动地接收信息,而是可以主动地输入数据.做出选择或触发事件,从而更加深入地参与到应用中来. 此 ...

  5. 洛谷 NOIP 2023 模拟赛 T2 汪了个汪

    洛谷 NOIP 2023 模拟赛 T2 汪了个汪 考试建出正解图不知道怎么处理,题解区樱雪喵博客薄纱. 樱雪喵题解链接 Ps:笔者语文爆炸,不建议阅读本文 思路 首先你会发现,一共有 \(\frac{ ...

  6. 七、FreeRTOS学习笔记-中断管理

    FreeRTOS学习笔记-中断管理 中断:让CPU打断正常运行的程序,转而去处理紧急的事件(程序) 中断执行机制,可简单概括为三步: 1.中断请求:外设产生中断请求(GPIO外部中断.定时器中断等) ...

  7. python爬虫利器之Playwright

    Playwright 是微软在 2020 年初开源的新一代自动化测试工具,它的功能类似于 Selenium.Pyppeteer 等,都可以驱动浏览器进行各种自动化操作.它的功能也非常强大,对市面上的主 ...

  8. clickhouse之安装与基本使用

    近期要做一个数据统计功能,公司选择了clickhouse作为数据库:下面记录一下该数据库的特性和使用教程. clickhouse是一个列式数据库,主要用于数据分析:从目前使用看来,特点如下: 列式存储 ...

  9. Vue项目报TypeError: Cannot read properties of undefined (reading '_wrapper')

    前情 最近在做一个营销活动的时候,我选择了Vue技术栈来开发. 坑位 项目看似一切都正常,但当我在绑定的js事件中去修改当前组件的data上的值时会报错:TypeError: Cannot read ...

  10. [转载] 6 个技巧,提升 C++11 的 vector 性能

    转载:https://www.sohu.com/a/120595688_465979 Vector 就像是 C++ STL 容器的瑞士军刀.Bjarne Stoutsoup 有一句话 – " ...