LCR 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;
}
}
LCR 170. 交易逆序对的总数的更多相关文章
- 剑指offer-第五章优化时间和空间效率(数组中的逆序对的总数)
题目:在数组中如果两个数字的前面的数比后面的数大,则称为一对逆序对.输入一个数组求出数组中逆序对的总数. 以空间换时间:思路:借助一个辅助数组,将原来的数组复制到该数组中.然后将该数组分成子数组,然后 ...
- 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
include "stdafx.h" #include<iostream> #include<vector> #include <algorithm& ...
- 剑指offer系列61---数组中的逆序对
[题目]在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. * [思路]运用归并排序的思想. * 首先将数组分成两个子数组,统 ...
- [剑指OFFER] 数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 分析:利用归并排序的思想,分成2部分,每一部分按照从大到 ...
- lintcode:逆序对
题目 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.给你一个数组,求出这个数组中逆序对的总数.概括:如果a[i] > a[j] 且 i < j, a[i] ...
- (剑指Offer)面试题36:数组中的逆序对
题目: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 思路: 1.顺序扫描 顺序扫描整个数组,每扫描到一个数字,就将该数 ...
- 【剑指offer】求逆序对的个数
2013-09-07 10:50:31 面试题36:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字构成一个逆序对.输入一个数组,求出这个数组中逆序对的总数. 小结: 最直观的的方法是: ...
- 九度OJ 1348 数组中的逆序对 -- 归并排序
题目地址:http://ac.jobdu.com/problem.php?pid=1348 题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求 ...
- 【剑指offer】面试题36:数组中的逆序对
题目: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 思路: 归并排序的合并过程.主要是考虑合并两个有序序列时,计算逆序 ...
- 【剑指Offer学习】【面试题36:数组中的逆序对】
题目:在数组中的两个数字假设前面一个数字大于后面的数字.则这两个数字组成一个逆序对.输入一个数组.求出这个数组中的逆序对的总数. 举例分析 比如在数组{7, 5, 6, 4 中, 一共存在5 个逆序对 ...
随机推荐
- 不敢相信,Nginx 还能这么玩?
大家好,我是程序员鱼皮.今天来聊聊 Nginx 技术,这是一个企业项目必用,但是却经常被程序员忽略的技术.学好 Nginx,可以助你在求职中脱颖而出. 或许你会想:"Nginx 不就是用来部 ...
- 使用最小二乘法进行线性回归(Python)
已知测得某块地,当温度处于15至40度之间时,数得某块草地上小花朵的数量和温度值的数据如下表所示.现在要来找出这些数据中蕴含的规律,用来预测其它未测温度时的小花朵的数量. 测得数据如下图所示: imp ...
- 低功耗4G模组:Air780EP开发板RC522实例
本文讲解合宙Air780EP开发板RC522实例,文末[阅读原文]获取最新资料. 本文档适用于Air780EP开发板 关联文档和使用工具 LuatOS-Soc固件获取 https://gitee. ...
- 话说ReferenceQueue
也是几年前写的,在内部邮件列表里发过,在这里保存一下. 看到了这篇帖子: <WeakHashMap的神话>http://www.javaeye.com/topic/587995 因为Jav ...
- ThreadLocal源代码分析
最早接触ThreadLocal这个东东,还是在学Hibernate的时候,当时看ThreadLocal没明白是干什么的,后来在网上查才明白ThreadLocal的用途,ThreadLocal其实蛮有用 ...
- 数据库管理软件之DataGrip
DataGrip 是由JetBrains公司推出的数据库管理软件,DataGrip支持几乎所有主流的关系数据库产品,如DB2.Derby.H2.MySQL.Oracle.PostgreSQL.SQL ...
- 揭秘UGO SQL审核功能4大特性,让业务平滑迁移至GaussDB
业务挑战 数据库是企业应用系统的核心,SQL作为数据库查询.更新等操作的标准语言,重要性不言而喻.然而在实际的SQL开发过程中,也面临着诸多挑战: 数据库应用开发人员的SQL能力良莠不齐,经常写出不符 ...
- CSS 变量与运算
1.变量 变量声明:变量名使用 "--" 为前缀,且区分大小写 /* 全局变量 */ :root{ --bgColor: red; } /* 布局变量 */ p{ --bgColo ...
- fastadmin-表格使用
1.弹窗页面大小 <div id="toolbar" class="toolbar"> <a data-area='["90%&qu ...
- VTK 设置面片背面颜色
在上一篇文章切开了零件,发现零件内部和外部颜色一样,当需要不一样时,可以通过actor的SetBackfaceProperty方法设置背面属性. 代码跟上一篇几乎一样,只是给actor设置了SetBa ...