(每日一道算法题)交易逆序对的总数

LCR 170. 交易逆序对的总数 - 力扣(LeetCode)

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

暴力解法的问题

最直观的解法是双重循环遍历所有可能的 (i, j) 组合,统计满足 i < j 且 record[i] > record[j] 的对数。这种方法的时间复杂度为 O(n²),当数组长度较大(例如 50000)时,显然无法高效处理。

归并排序解法

归并排序的分治思想天然适合解决逆序对问题。在归并排序的合并阶段,可以高效地统计逆序对数目。

归并排序合并阶段的统计逻辑
  1. 分治:将数组分为左右两部分,递归处理左右子数组。
  2. 合并:合并两个有序子数组时,若左子数组的当前元素大于右子数组的当前元素,则左子数组中剩余的所有元素均与该右子数组元素构成逆序对。
  3. 累加:每次发现左子数组元素大于右子数组元素时,累加左子数组剩余元素的个数到总逆序对数目。
代码实现
class Solution {int[] tmp; // 临时数组用于归并排序int ret;   // 统计逆序对总数public int reversePairs(int[] nums) {tmp = new int[nums.length];mergesort(nums, 0, nums.length - 1);return ret;}private void mergesort(int[] nums, int left, int right) {if (left >= right) return;int mid = left + (right - left) / 2;// 递归处理左右子数组mergesort(nums, left, mid);mergesort(nums, mid + 1, right);// 若左子数组最大值 <= 右子数组最小值,无需合并if (nums[mid] <= nums[mid + 1]) return;// 合并两个有序子数组,并统计逆序对int cur1 = left, cur2 = mid + 1, i = 0;while (cur1 <= mid && cur2 <= right) {if (nums[cur1] <= nums[cur2]) {tmp[i++] = nums[cur1++];} else {ret += mid - cur1 + 1; // 统计逆序对数目tmp[i++] = nums[cur2++];}}// 处理剩余元素while (cur1 <= mid) tmp[i++] = nums[cur1++];while (cur2 <= right) tmp[i++] = nums[cur2++];// 将排序后的临时数组复制回原数组for (int j = left; j <= right; j++) {nums[j] = tmp[j - left];}}
}

示例分析

以示例 record = [9, 7, 5, 4, 6] 为例,归并排序的合并过程如下:

  1. 初始分割:数组分为左 [9,7,5] 和右 [4,6]
  2. 处理左子数组
    • 分割为 [9,7] 和 [5],合并时 9 > 7 产生 1 个逆序对。
    • 合并 [7,9] 和 [5]7 > 5 产生 2 个逆序对。
  3. 处理右子数组:合并 [4] 和 [6],无逆序对。
  4. 合并左右子数组
    • 比较 5 和 4,产生 3 个逆序对。
    • 比较 5 和 6,无逆序对。
    • 比较 7 和 6,产生 2 个逆序对。
    • 累计总逆序对数目为 1 + 2 + 3 + 2 = 8。

复杂度分析

  • 时间复杂度:O(n log n),归并排序的时间复杂度。
  • 空间复杂度:O(n),用于归并排序的临时数组。

通过归并排序的分治策略,可以在高效排序的同时统计逆序对数目,从而快速解决大规模数据的逆序对问题。

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

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

相关文章

【从0实现muduo库系列】第二讲:基础类型与工具类

0 章节重点 重点内容 视频讲解&#xff1a;《CLinux编程进阶&#xff1a;从0实现muduo C网络框架系列》-第2讲.基础类型与工具类 代码改动 cp -r lesson1 lesson2 实现&#xff1a;base/Types.h 实现&#xff1a;base/copyable.h和noncopyable.h 实现&#xff1a;base/Str…

Qemu-STM32(十):STM32F103开篇

简介 本系列博客主要描述了STM32F103的qemu模拟器实现&#xff0c;进行该项目的原因有两点: 作者在高铁上&#xff0c;想在STM32F103上验证一个软件框架时&#xff0c;如果此时掏出开发板&#xff0c;然后接一堆的线&#xff0c;旁边的人估计会投来异样的目光&#xff0c;特别…

鸿蒙HarmonyOS NEXT应用崩溃分析及修复

鸿蒙HarmonyOS NEXT应用崩溃分析及修复 如何保证应用的健壮性&#xff0c;其中一个指标就是看崩溃率&#xff0c;如何降低崩溃率&#xff0c;就需要知道存在哪些崩溃&#xff0c;然后对症下药&#xff0c;解决崩溃。那么鸿蒙应用中存在哪些崩溃类型呢&#xff1f;又改如何解决…

K8S-etcd服务无法启动问题排查

一、环境、版本信息说明 k8s&#xff1a;v1.19.16 etcdctl version: 3.5.1 3台etcd&#xff08;10.xxx.xx.129、10.xxx.xx.130、10.xxx.xx.131&#xff09;组成的集群。 二、问题根因 129节点的etcd数据与其他两台数据不一致&#xff0c;集群一致性校验出错导致无法加入集…

【视觉提示学习】3.21论文随想

. . Frontiers of Information Technology & Electronic Engineering. 2024, 25(1): 42-63 https://doi.org/10.1631/FITEE.2300389 中文综述&#xff0c;根据里面的架构&#xff0c;把视觉提示学习分成两类&#xff0c;一类是单模态提示学习&#xff08;以vit为代表&…

基于SpringBoot的“校园招聘网站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“校园招聘网站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统整体功能图 局部E-R图 系统首页界面 系统注册…

爱普生晶振FC2012AA汽车ADAS主控制系统的理想选择

在汽车智能化的浪潮中&#xff0c;先进驾驶辅助系统&#xff08;ADAS&#xff09;正迅速成为现代汽车的核心技术之一。ADAS 系统通过集成多种传感器、摄像头和高性能芯片&#xff0c;实现对车辆周围环境的实时监测和智能决策&#xff0c;为驾驶者提供全方位的安全保障。而在这一…

基于 ABAP RESTful 应用程序编程模型开发 OData V4 服务

一、概念 以个人图书管理为例&#xff0c;创建一个ABAP RESTful 应用程序编程模型项目。最终要实现的效果&#xff1a; 用于管理书籍的程序。读取、修改和删除书籍。 二、Data Model-数据模型 2.1 创建项目基础数据库表 首先&#xff0c;创建一个图书相关的表&#xff0c;点…

阿里云平台服务器操作以及发布静态项目

目录&#xff1a; 1、云服务器介绍2、云服务器界面3、发布静态项目1、启动nginx2、ngixn访问3、外网访问测试4、拷贝静态资源到nginx目录下并重启nginx 1、云服务器介绍 2、云服务器界面 实例详情&#xff1a;里面主要显示云服务的内外网地址以及一些启动/停止的操作。监控&…

注意力机制,本质上是在做什么?

本文以自注意机制为例&#xff0c;输入一个4*4的矩阵 如下&#xff1a; input_datatorch.tensor([[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16] ],dtypetorch.float) 得到Q和K的转置如下。 此时&#xff0c;计算QK^T ,得到如下结果 第一行第一个位置就是第一条样本和第…

C语言-数组指针和指针数组

指针 数组指针与指针数组 数组指针 定义 概念&#xff1a;数组指针是指向数组的指针&#xff0c;本质上还是指针 特点&#xff1a; ①先有数组&#xff0c;后有指针 ②它指向的是一个完整的数组 一维数组指针 语法&#xff1a; 数据类型 (*指针变量名)[容量]; 案例&a…

【前四届会议均已完成独立出版及EI检索 | 河南大学、河南省科学院主办,多高校单位承协办】第五届信号图像处理与通信国际学术会议(ICSIPC 2025)

第五届信号图像处理与通信国际学术会议&#xff08;ICSIPC 2025&#xff09; 2025 5th International Conference on Signal Image Processing and Communication&#xff08;ICSIPC 2025&#xff09; 会议官网&#xff1a;http://www.icsipc.org 【论文投稿】 会议时间&…

AI 时代的通信新范式:MCP(模块化通信协议)的优势与应用

文章目录 引言 1. 传统 API 的局限性2. MCP&#xff08;模块化通信协议&#xff09;的核心优势2.1 更好的模块化支持2.2 低耦合性与灵活性2.3 高性能数据传输2.4 适配分布式 AI 计算架构 3. AI 时代的 MCP 应用案例4. 结论&#xff1a;AI 时代的通信新范式 引言 在 AI 驱动的现…

Linux 文件系统的日志模式与性能影响

在 Linux 文件系统中&#xff0c;**日志模式&#xff08;Journaling Mode&#xff09;** 是文件系统保证数据一致性和快速恢复的核心机制&#xff0c;但不同的日志模式会对性能产生显著影响。以下是详细分析及优化建议&#xff1a; --- ### **一、日志模式的核心分类** Linux…

TISAX认证注意事项的详细介绍

TISAX&#xff08;Trusted Information Security Assessment Exchange&#xff09;认证的注意事项犹如企业在信息安全领域航行时必须遵循的灯塔指引&#xff0c;至关重要且不容忽视。以下是对TISAX认证注意事项的详尽阐述&#xff1a; 首先&#xff0c;企业需深入研读并理解TI…

Nodejs 项目打包部署方式

方式一&#xff1a;PM2 一、准备工作 确保服务器上已安装 Node.js 环境建议使用 PM2 进行进程管理&#xff08;需要额外安装&#xff09; 二、部署步骤 1.首先在服务器上安装 PM2&#xff08;推荐&#xff09;&#xff1a; npm install -g pm22.将项目代码上传到服务器&…

springboot整合modbus实现通讯

springboot整合modbus4j实现tcp通讯 前言 本文基于springboot和modbus4j进行简单封装&#xff0c;达到开箱即用的目的&#xff0c;目前本方案仅实现了tcp通讯。代码会放在最后&#xff0c;按照使用方法操作后就可以直接使用 介绍 在使用本方案之前&#xff0c;有必要对modb…

【论文阅读】Contrastive Clustering Learning for Multi-Behavior Recommendation

论文地址&#xff1a;Contrastive Clustering Learning for Multi-Behavior Recommendation | ACM Transactions on Information Systems 摘要 近年来&#xff0c;多行为推荐模型取得了显著成功。然而&#xff0c;许多模型未充分考虑不同行为之间的共性与差异性&#xff0c;以…

C/C++蓝桥杯算法真题打卡(Day6)

一、P8615 [蓝桥杯 2014 国 C] 拼接平方数 - 洛谷 方法一&#xff1a;算法代码&#xff08;字符串分割法&#xff09; #include<bits/stdc.h> // 包含标准库中的所有头文件&#xff0c;方便编程 using namespace std; // 使用标准命名空间&#xff0c;避免每次调用…

纯vue手写流程组件

前言 网上有很多的vue的流程组件&#xff0c;但是本人不喜欢很多冗余的代码&#xff0c;喜欢动手敲代码&#xff1b;刚开始写的时候&#xff0c;确实没法下笔&#xff0c;最后一层一层剥离&#xff0c;总算实现了&#xff1b;大家可以参考我写的代码&#xff0c;可以拿过去定制…