每日OJ题_分治归并②_LCR 170. 交易逆序对的总数

目录

力扣LCR 170. 交易逆序对的总数

解析代码1

解析代码2


力扣LCR 170. 交易逆序对的总数

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)。

限制:

0 <= record.length <= 50000

class Solution {
public:int reversePairs(vector<int>& record) {};

解析代码1

        用归并排序求逆序数是很经典的方法,主要就是在归并排序的合并过程中统计出逆序对的数量,也就是在合并两个有序序列的过程中,能够快速求出逆序对的数量。

如果将数组从中间划分成两个部分,那么我们可以将逆序对产生方式划分成三组:

  • 逆序对中两个元素:全部从左数组中选择。
  • 逆序对中两个元素:全部从右数组中选择。
  • 逆序对中两个元素:一个选左数组另一个选右数组。

        根据排列组合的分类相加原理,三种情况下产生的逆序对的总和,正好等于总的逆序对数量。而这个思路正好匹配归并排序的过程:

  • 先排序左数组。
  • 再排序右数组。
  • 左数组和右数组合二为一。

        因此,我们可以利用归并排序的过程,先求出左半数组中逆序对的数量,再求出右半数组中逆序对的数量,最后求出⼀个选择左边,另⼀个选择右边情况下逆序对的数量,三者相加即可。

class Solution {vector<int> tmp;
public:int reversePairs(vector<int>& record) {tmp.resize(record.size());return mergeSortCnt(record, 0, record.size() - 1);}int mergeSortCnt(vector<int>& arr, int left, int right){   // 解法一:找出该数之前,有多少个数比我大 -> 升序if(left >= right)return 0;int ret = 0, mid = (left + right) >> 1;// 左边逆序对的个数+排序 + 右边逆序对的个数+排序ret += mergeSortCnt(arr, left, mid);ret += mergeSortCnt(arr, mid + 1, right);// 一左一右逆序对的个数int cur1 = left, cur2 = mid + 1, i = 0;while(cur1 <= mid && cur2 <= right){if(arr[cur1] > arr[cur2]){   // 此时cur2后面的都是比cur1小的ret += mid - cur1 + 1;tmp[i++] = arr[cur2++];}else{tmp[i++] = arr[cur1++];}}// 处理排序while (cur1 <= mid) tmp[i++] = arr[cur1++];while (cur2 <= right) tmp[i++] = arr[cur2++];for (int j = left; j <= right; j++)arr[j] = tmp[j - left];return ret;}
};

解析代码2

在代码一的基础上可以选择找出该数之前,有多少个数比我小 -> 降序:

class Solution {vector<int> tmp;
public:int reversePairs(vector<int>& record) {tmp.resize(record.size());return mergeSortCnt(record, 0, record.size() - 1);}int mergeSortCnt(vector<int>& arr, int left, int right){   // 解法二:找出该数之前,有多少个数比我小 -> 降序if(left >= right)return 0;int ret = 0, mid = (left + right) >> 1;// 左边逆序对的个数+排序 + 右边逆序对的个数+排序ret += mergeSortCnt(arr, left, mid);ret += mergeSortCnt(arr, mid + 1, right);// 一左一右逆序对的个数int cur1 = left, cur2 = mid + 1, i = 0;while(cur1 <= mid && cur2 <= right){if(arr[cur1] > arr[cur2]){   // 此时cur2后面的都是比cur1小的// ret += mid - cur1 + 1;// tmp[i++] = arr[cur2++];ret += right - cur2 + 1;tmp[i++] = arr[cur1++]; // 降序}else{// tmp[i++] = arr[cur1++];tmp[i++] = arr[cur2++]; // 降序}}// 处理排序while (cur1 <= mid) tmp[i++] = arr[cur1++];while (cur2 <= right) tmp[i++] = arr[cur2++];for (int j = left; j <= right; j++)arr[j] = tmp[j - left];return ret;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/710135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

条款02:尽量以const,enum,inline代替#define

目录 1.const定义常量 2.cosnt修饰指针 3.class的专属常量 4.the enum hack 5.用inline代替#define宏函数 1.const定义常量 #define B 1.63 const int B 1.63 原因&#xff1a; 1.#define是在预处理阶段&#xff0c;直接将代码中的B替换为1.63会产生多份&#xff0c;而…

uniapp如何实现关闭前面指定数目页面

需求 &#xff1a; 路由从 页面A -> 页面B-> 页面C-> 页面D 我希望在 页面C跳到页面CD 后 在页面D 中 点击返回&#xff08;物理键或是代码返回&#xff09;&#xff0c;直接返回到A,而不是页面C 所以我需要把BC页面给销毁掉 以下是我的实现思路&#xff0c;在h…

Linux系统编程之线程互斥锁的使用方法

文章目录 一、Linux上线程开发互斥锁概要二、创建及销毁互斥锁2.1 示例&#xff1a;主线程等待两个线程退出&#xff0c;1线程和2线程打印信息 三、互斥量的初始化问题 一、Linux上线程开发互斥锁概要 互斥量&#xff08;mutex&#xff09;从本质上来说是一把锁&#xff0c;在…

Stable Diffusion 模型分享:yayoi_mix(日本美女、真实、照片)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五 下载地址 模型介绍 yayoi_mix 是一个现实模型&#xff0c;是一个针对日本女性训练及合并的模型。 条目内容类型大模型基础模型SD…

前后端项目宝塔linux部署(springboot,vue,python)

宝塔linux安装就省略了&#xff0c;网上一堆 1.部署后端 1.首先把自己项目里面打包好的的jar包上传到服务器随便一个地方&#xff0c;我这里就上传到www/wwwroot下面了&#xff0c;宝塔的文件页面可以很便携上传 2.然后到下面这个页面 选那个java环境管理装个jdk&#xff…

全网首个GDB移植手册【Howto:Porting the GUN Debugger】翻译

Howto:Porting the GUN Debugger ✍【作者】&#xff1a;电子科大不知名程序员 &#x1f4e3;【说明】&#xff1a;本文是自己在搭建mcore架构GDB时的参考的手册&#xff0c;具有很强的学习指导性&#xff0c;因原文档&#xff08;链接&#xff1a;https://www.embecosm.com/a…

企业文件图纸加密有哪些?图纸文件加密防泄密软件如何选?

在现在的市场发展中&#xff0c;对于企业的图纸文件安全问题越来越重视&#xff0c;如设计图纸&#xff0c;重要文件等&#xff0c;一旦泄漏就会给企业造成巨大的经济损失。所以对企业管理者来讲&#xff0c;如何才能选择一款好用的适合本企业的图纸文件加密软件是非常重要的&a…

【常用的 SVN 命令及简要示例】

常用的 SVN 命令及简要示例&#xff0c;供您参考&#xff1a; 检出代码: svn checkout https://svn.example.com/project/trunk提交修改: svn commit -m "Commit message"更新代码: svn update创建分支: svn copy https://svn.example.com/project/trunk \https://sv…

网络编程难点之select、poll与epoll详解

前言 为什么需要I/O多路复用技术&#xff1f; 首先&#xff0c;I/O多路复用技术主要被应用在需要高性能的网络服务器程序中。 高性能网络服务器程序需要做的事情就是供多个客户端同时进行连接并处理客户端传送过来的数据请求&#xff1a; 对于这种情况&#xff0c;很多人自然…

【招生】江西师范大学—地质灾害研究团队—地理与环境学院/鄱阳湖流域实验室

【招生】江西师范大学—地质灾害研究团队—地理与环境学院/鄱阳湖流域实验室 研究方向&#xff1a;InSAR、极化SAR、GNSS、地球物理、GIS 招生专业&#xff1a;GIS、人文地理 学院地址&#xff1a;江西南昌江西师范大学

什么是数据同步利器DataX,如何使用?

什么是 Datax? DataX 是阿里云 DataWorks数据集成 的开源版本&#xff0c;使用Java 语言编写&#xff0c;在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、Ma…

python笔记_数据类型

定义&#xff1a;python的变量在使用前必须赋值&#xff0c;数据类型指的是变量指定的内存数据的类型 string字符串类型使用引号int整型整数float浮点型小数bool布尔值(逻辑)输出true/false A&#xff0c;整数类型 整型字节 1,python的整数有十六进制&#xff0c;十进制&#…

面试数据库篇(mysql)- 11主从同步

原理 MySQL主从复制的核心就是二进制日志 二进制日志&#xff08;BINLOG&#xff09;记录了所有的 DDL&#xff08;数据定义语言&#xff09;语句和 DML&#xff08;数据操纵语言&#xff09;语句&#xff0c;但不包括数据查询&#xff08;SELECT、SHOW&#xff09;语句。 复…

Java 小项目开发日记 03(文章分类接口的开发)

Java 小项目开发日记 03&#xff08;文章分类接口的开发&#xff09; 项目目录 配置文件&#xff08;pom.xml&#xff09; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocat…

【Elasticsearch查询】精确查询

文章目录 复合查询constant_score querybool querydis_max queryfunction_score queryboosting query单层嵌套双层嵌套 词项查询term query&#xff08;词项查询&#xff09;数字的精确查询文本的精确查询查询优化 terms query&#xff08;多词项查询&#xff09;terms_set que…

计算机网络:数据链路层知识点汇总

文章目录 一、数据链路层功能概述二、封装成帧和透明传输三、差错控制&#xff08;检错编码&#xff09;四、差错控制&#xff08;纠错编码&#xff09;五、流量控制与可靠传输机制六、停止-等待协议七、后退N帧协议&#xff08;GBN&#xff09;八、选择重传协议&#xff08;SR…

2024年华为OD机试真题-运输时间-Python-OD统一考试(C卷)

题目描述&#xff1a; M&#xff08;1<M <20&#xff09;辆车需要在一条不能超车的单行道到达终点&#xff0c;起点到终点的距离为N&#xff08;1<N<400&#xff09;。速度快的车追上前车后&#xff0c;只能以前车的速度继续行驶&#xff0c;求最后一车辆到达目的地…

用户增长6步法

什么是用户增长&#xff1f; 通过痛点、产品、渠道、内容、技术、数据等要素实现用户的获取、激活、留存、变现、推荐&#xff0c;用户增长包含了产品出现前的用户增长、产品生产周期内的用户增长、产品生命周期外的用户增长三个阶段。 用户增长6步法&#xff1a;方法、模型和…

【2024年】江苏省彭城监狱监狱食堂生活物资蔬菜类采购项目竞争磋商公告

【2024年】江苏省彭城监狱监狱食堂生活物资蔬菜类采购项目竞争磋商公告 &#xff08;招标编号&#xff1a;PC-JY-2024-004&#xff09; 项目所在地区&#xff1a;江苏省徐州市 一、招标条件 本监狱食堂生活物资蔬菜类采购已由项目审批/核准/备案机关批准&#xff0c;项目资金来…

YOLOv8-TensorRT on Jetson

YOLOv8-TensorRT Jetson 项目地址&#xff1a;https://github.com/triple-Mu/YOLOv8-TensorRT/blob/main/docs/Jetson.md 文档地址&#xff1a;https://github.com/triple-Mu/YOLOv8-TensorRT/blob/main/docs/Jetson.md 注意 engine 文件不跨平台&#xff0c;只能在对应的平台…