每日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/713792.shtml

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

相关文章

Linux系统中安装redis+redis后台启动+常见相关配置

1、下载Redis Redis官网&#xff1a;https://redis.io/ 历史版本&#xff1a; http://download.redis.io/releases 2、连接Linux&#xff08;或者VMwear&#xff09; 我们安装的是linux版本的redis 打开xftp我们需要先将我们的Redis上传到服务器上 解压到这里 解压的指令 …

创建型模式之建造者模式

一、概述 1、建造者模式&#xff1a;将一个复杂对象的构建和它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示 2、将客户端与包含多个部件的复杂对象的创建过程分离&#xff0c;客户端无须知道复杂对象的内部组成部分与装配方式&#xff0c;只需要知道所需建造…

Spring MVC源码中设计模式——适配器模式

适配器模式介绍 适配器模式&#xff08;Adapter Pattern&#xff09;是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式&#xff0c;它结合了两个独立接口的功能。 应用场景&#xff1a; 1、系统需要使用现有的类&#xff0c;而此类的接口不符合系统的需要…

[c++] 继承和多态整理一

1 private 和 protected 继承&#xff0c;子类指针不能赋值给父类指针 如下代码&#xff0c;有一个基类 Base&#xff0c;Derived1&#xff0c;Derived2&#xff0c;Derived3 3 个子类继承了基类 Base&#xff0c;分别是 private 继承&#xff0c;protected 继承&#xff0c;p…

基于springboot+vue的纺织品企业财务管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Socket网络编程(五)——TCP数据发送与接收并行

目录 主要实现需求TCP 服务端收发并行重构启动main方法重构重构分离收发消息的操作重构接收消息的操作重构发送消息TCPServer调用发送消息的逻辑监听客户端链接逻辑重构Socket、流的退出与关闭 TCP 客户端收发并行重构客户端 main函数重构客户端接收消息重构客户端发送消息重构…

前端封装通用下载方法及下载后端返回的文件流

目录 1.下载方法封装 2.将后端返回的文件流转换为文件 3.总结 1.下载方法封装 ①说明 前端的请求大概分为三种类型 普通请求&#xff1a;常用的get&#xff0c;post&#xff0c;put&#xff0c;delete等请求 上传请求&#xff1a;使用post请求&#xff0c;发送formdata对…

Zookeeper学习1:概述、安装、应用场景、集群配置

文章目录 概述安装LinuxWindows 配置参数集群参考配置文件配置步骤流程启动 概述 Zookeeper&#xff1a; 为分布式框架组件提供协调服务的中间件 【类似&#xff1a;文件系统通知机制】 负责存储上下层应用关系的数据以及接收观察者注册监听&#xff0c;一旦观察查关心的数据发…

git操作基本指令

1.查看用户名 git config user.name 2.查看密码 git config user.password 3.查看邮箱 git config user.email 4.修改用户名 git config --global user.name "xxx(新用户名)" 5.修改密码 git config --global user.password "xxx(新密码)" 6.修改…

笔记73:ROS中的各种消息包

参考视频&#xff1a; 33.ROS 的标准消息包 std_msgs_哔哩哔哩_bilibili 34. ROS 中的几何包 geometry_msgs 和 传感器包 sensor_msgs_哔哩哔哩_bilibili 标准消息包&#xff1a;std_msgs常用消息包&#xff1a;common_msgs导航消息包&#xff1a;nav_msgs几何消息包&#xf…

实战分享:Tomcat打破双亲委派模型,实现Web应用独立与安全隔离的奥秘

目录 一、JVM 类加载机制 二、Tomcat 类加载器 2.2 findClass 介绍 3.2 loadClass 介绍 三、web应用隔离 3.1 Spring 加载问题 在开始文章内容之前&#xff0c;先来看三个问题 假如在 Tomcat 上运行了两个 Web 应用程序&#xff0c;两个 web 应用中有同名的Servlet&#xf…

C++数据结构与算法——二叉树的属性

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

AGI概念与实现

AGI AGI&#xff08;Artificial General Intelligence&#xff09;&#xff0c;中文名为“通用人工智能”或“强人工智能”&#xff0c;是指通过机器学习和数据分析等技术&#xff0c;使计算机具有类似于人类的认知和学习能力的技术. 多模态的大模型 &#xff08;Multimodal…

详细介绍如何用windows自带Hyper-V安装虚拟机(windows11和ubuntu22)

通过系统自带的hyper-v安装windows11&#xff0c;舒服又惬意&#xff0c;相比用第三方虚拟机软件速度快很多。 硬件准备 准备 系统需要符合能安装 Hyper-V 的最低要求windows版本含Hyper-V的功能 电脑空间 电脑要有足够的空间来安装你这个虚拟机。根据自己的磁盘容量情况来规…

2673. 使二叉树所有路径值相等的最小代价

给你一个整数 n 表示一棵 满二叉树 里面节点的数目&#xff0c;节点编号从 1 到 n 。根节点编号为 1 &#xff0c;树中每个非叶子节点 i 都有两个孩子&#xff0c;分别是左孩子 2 * i 和右孩子 2 * i 1 。 树中每个节点都有一个值&#xff0c;用下标从 0 开始、长度为 n 的整…

CloudCanal x Hive 构建高效的实时数仓

简述 CloudCanal 最近对于全周期数据流动进行了初步探索&#xff0c;打通了Hive 目标端的实时同步&#xff0c;为实时数仓的构建提供了支持&#xff0c;这篇文章简要做下分享。 基于临时表的增量合并方式基于 HDFS 文件写入方式临时表统一 Schema任务级的临时表 基于临时表的…

【Linux实践室】Linux初体验

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;Linux 目录结构介绍2.2 &#x1f514;Linux …

WebFlux相关问题及答案(2024)

1、什么是Spring WebFlux&#xff1f; Spring WebFlux 是 Spring Framework 5.0 中引入的一个全新的反应式框架&#xff0c;用于构建异步、非阻塞且事件驱动的服务。它允许开发者使用响应式编程模型来处理并发性很高的操作&#xff0c;而无需担心传统的多线程环境中的复杂性。…

poi工具读写excel操作学习总结

写在前面的话 POI作为比较早期的Excel处理工具&#xff0c;其使用较为成熟且广泛。EasyExcel相较之下&#xff0c;则是相对较新的工具&#xff0c;其却有着比POI更为优越的一些特性&#xff0c;如更加简单的API接口和更加优秀的性能。 性能对比&#xff1a;在数据量较小的情况下…

mybatis mysql insert 主键id为空

错误示范 java代码设置了param参数&#xff0c;但是sql 字段没有带上参数&#xff0c;例如 void insertV2(Param("historyDO") HistoryDO historyDO); <insert id"insertDuplicate" parameterType"com.test.entity.HistoryDO"keyProperty&…