当前位置: 首页 > news >正文

【算法】分治:归并排序之LCR 170.交易逆序对的总数(hard)

系列专栏

双指针

模拟算法

分治思想


目录

1、题目链接

2、题目介绍

3、解法

4、代码


1、题目链接

LCR 159. 库存管理 III - 力扣(LeetCode)

2、题目介绍

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

3、解法

  1. 逆序对的计算
    在归并排序的合并步骤中,当我们将两个已排序的子数组合并成一个有序数组时,如果左侧子数组中的某个元素大于右侧子数组中的某个元素,那么左侧子数组中该元素之后的所有元素(包括该元素本身)都将与右侧子数组中的该元素形成逆序对。因此,我们可以通过计算这样的元素对数来统计逆序对的总数。

  2. 具体实现

    • 分割:将数组分成左右两部分,递归地对它们进行排序。
    • 合并与计数:在合并过程中,使用两个指针分别指向左右子数组的起始位置,比较两个指针所指向的元素。如果左侧元素大于右侧元素,则左侧元素及其之后的所有元素都将与右侧当前元素形成逆序对,因此逆序对数增加 mid - cur1 + 1mid 是左右子数组的分界点,cur1 是左侧子数组的当前指针位置)。然后,将较小的元素放入临时数组 tmp 中,并移动相应的指针。
    • 复原:将临时数组 tmp 中的元素复制回原数组 record,以完成排序和逆序对的计算。
    • 时间复杂度:归并排序的时间复杂度为 O(n log n),其中 n 是数组的长度。在合并过程中,我们遍历了每个元素一次,因此计算逆序对的额外时间复杂度也是 O(n log n)。
    • 空间复杂度:归并排序需要额外的空间来存储临时数组 tmp,其大小为 n,因此空间复杂度为 O(n)。

4、代码

//归并排序
//升序
class Solution {vector<int> tmp;
public:int reversePairs(vector<int>& record) {tmp.resize(record.size());return mergeSort(record, 0, record.size() - 1);}// 查找区间内的逆序对总数(归并排序思想)int mergeSort(vector<int>& record, int left, int right){if (left >= right) return 0;// 1. 找中点将数组分成两部分// [left,mid] [mid+1,right]int mid = (right - left) / 2 + left;int ret = 0;// 2. 左边的个数 + 排序 ,右边的个数 + 排序ret += mergeSort(record, left, mid);ret += mergeSort(record, mid + 1, right);// 3. 一左一右的个数(升序版本)int cur1 = left, cur2 = mid + 1, i = 0;while (cur1 <= mid && cur2 <= right){if (record[cur1] <= record[cur2]) tmp[i++] = record[cur1++];else{ret += mid - cur1 + 1;//合并过程中计数,逆序对tmp[i++] = record[cur2++];}}// 4. 处理排序过程while (cur1 <= mid) tmp[i++] = record[cur1++];while (cur2 <= right) tmp[i++] = record[cur2++];// 复原for (int i = left; i <= right; i++)record[i] = tmp[i - left];return ret;}
};

💗感谢阅读!💗

相关文章:

【算法】分治:归并排序之LCR 170.交易逆序对的总数(hard)

系列专栏 双指针 模拟算法 分治思想 目录 1、题目链接 2、题目介绍 3、解法 4、代码 1、题目链接 LCR 159. 库存管理 III - 力扣&#xff08;LeetCode&#xff09; 2、题目介绍 在股票交易中&#xff0c;如果前一天的股价高于后一天的股价&#xff0c;则可以认为存在一…...

2024.9.28 作业+思维导图

widget.cpp #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {this->setFixedSize(320,448);this->setWindowFlag(Qt::FramelessWindowHint);//QPushButtonQPushButton *PushButton1 new QPushButton("登录",this);PushButto…...

树莓派外挂Camera(基操)(TODO)

&#xff08;TODO&#xff09; 手上有OV5647&#xff0c;OV2640&#xff0c;看这次能不能驱动吧。。。 树莓派3B CSI摄像头配置-阿里云开发者社区 你可以使用树莓派3B的CSI接口连接相机模块。首先&#xff0c;确保相机模块正确连接到CSI接口。然后&#xff0c;使用raspi-config…...

讯飞星火编排创建智能体学习(二)决策节点

目录 概述 决策节点 文生图节点 连接节点 测试结果 概述 在上一篇博文讯飞星火编排创建智能体学习&#xff08;一&#xff09;最简单的智能体构建-CSDN博客&#xff0c;我介绍了编排创作智能体&#xff0c;这篇来介绍一下“决策节点”。 决策节点 在编排创作智能体中&…...

YOLOv5改进:Unified-loU,用于高品质目标检测的统一loU ,2024年8月最新IoU

💡💡💡现有IoU问题点:IoU (Intersection over Union)作为模型训练的关键,极大地显示了当前预测框与Ground Truth框之间的差异。后续研究者不断在IoU中加入更多的考虑因素,如中心距离、纵横比等。然而,仅仅提炼几何差异是有上限的;而且新的对价指数与借据本身存在潜在…...

力扣 简单 112.路径总和

文章目录 题目介绍题解 题目介绍 题解 class Solution {public boolean hasPathSum(TreeNode root, int targetSum) {// 只在最开始的时候判断树是否为空if (root null) {return false;}targetSum - root.val;if (root.left null && root.right null) { // root 是…...

OpenMV与STM32通信全面指南

目录 引言 一、OpenMV和STM32简介 1.1 OpenMV简介 1.2 STM32简介 二、通信协议概述 三、硬件连接 3.1 硬件准备 3.2 引脚连接 四、软件环境搭建 4.1 OpenMV IDE安装 4.2 STM32开发环境 五、UART通信实现 5.1 OpenMV端编程 5.2 STM32端编程 六、SPI通信实现 6.1 …...

Python库matplotlib之二

Python库matplotlib之二 figureAxessubplot figure matplotlib.pyplot.figure(numNone, figsizeNone, dpiNone, facecolorNone, edgecolorNone, frameonTrue, FigureClass<class ‘matplotlib.figure.Figure’>, clearFalse, **kwargs) num&#xff0c;int 或 str 或 fi…...

DAY17||654.最大二叉树 |617.合并二叉树 |700.二叉搜索树中的搜索 |

654.最大二叉树 题目&#xff1a;654. 最大二叉树 - 力扣&#xff08;LeetCode&#xff09; 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下&#xff1a; 二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树…...

读构建可扩展分布式系统:方法与实践16读后总结与感想兼导读

1. 基本信息 构建可扩展分布式系统&#xff1a;方法与实践 [美]伊恩戈顿(Ian Gorton)著 机械工业出版社,2024年5月出版 1.1. 读薄率 书籍总字数188千字&#xff0c;笔记总字数49688字。 读薄率49688188000≈26.4% 1.2. 读厚方向 设计模式&#xff1a;可复用面向对象软件的…...

Anaconda 安装

目录 - [简介](#简介) - [安装Anaconda](#安装anaconda) - [启动Anaconda Navigator](#启动anaconda-navigator) - [创建环境](#创建环境) - [管理包](#管理包) - [常用命令行操作](#常用命令行操作) - [Jupyter Notebook 快速入门](#jupyter-notebook-快速入门) - [结…...

优雅使用 MapStruct 进行类复制

前言 在项目中&#xff0c;常常会遇到从数据库读取数据后不能直接返回给前端展示的情况&#xff0c;因为还需要对字段进行加工&#xff0c;比如去除时间戳记录、隐藏敏感数据等。传统的处理方式是创建一个新类&#xff0c;然后编写大量的 get/set 方法进行赋值&#xff0c;若字…...

第19周JavaWeb编程实战-MyBatis实现OA系统 1-OA系统

办公OA系统项目开发 课程简介 本课程将通过慕课办公OA平台的开发&#xff0c;讲解实际项目开发中必须掌握的技能和设计技巧。课程分为三个主要阶段&#xff1a; 需求说明及环境准备&#xff1a; 基于RBAC的访问控制模块开发&#xff1a; 多级请假审批流程开发&#xff1a; …...

仿黑神话悟空跑动-脚下波纹特效(键盘wasd控制走动)

vue使用three.js实现仿黑神话悟空跑动-脚下波纹特效 玩家角色的正面始终朝向鼠标方向&#xff0c;且在按下 W 键时&#xff0c;玩家角色会朝着鼠标方向前进 空格建跳跃 <template><div ref"container" class"container" click"onClick"…...

`torch.utils.data`模块

在PyTorch中&#xff0c;torch.utils.data模块提供了许多有用的工具来处理和加载数据。以下是对您提到的DataLoader, Subset, BatchSampler, SubsetRandomSampler, 和 SequentialSampler的详细解释以及使用示例。 1. DataLoader DataLoader是PyTorch中用于加载数据的一个非常…...

深入理解 `strncat()` 函数:安全拼接字符串

目录&#xff1a; 前言一、 strncat() 函数的基本用法二、 示例代码三、 strncat() 与 strcat() 的区别四、 注意事项五、 实际应用场景总结 前言 在C语言中&#xff0c;字符串操作是编程中非常常见的需求。strncat() 函数是标准库中用于字符串拼接的一个重要函数&#xff0c;…...

OpenCV_自定义线性滤波(filter2D)应用详解

OpenCV filter2D将图像与内核进行卷积&#xff0c;将任意线性滤波器应用于图像。支持就地操作。当孔径部分位于图像之外时&#xff0c;该函数根据指定的边界模式插值异常像素值。 卷积核本质上是一个固定大小的系数数组&#xff0c;数组中的某个元素被作为锚点&#xff08;一般…...

设计模式之装饰模式(Decorator)

前言 这个模式带给我们有关组合跟继承非常多的思考 定义 “单一职责” 模式。动态&#xff08;组合&#xff09;的给一个对象增加一些额外的职责。就增加功能而言&#xff0c;Decorator模式比生成子类&#xff08;继承&#xff09;更为灵活&#xff08;消除重复代码 & 减少…...

大数据-146 Apache Kudu 安装运行 Dockerfile 模拟集群 启动测试

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…...

React入门准备

React是什么 React是一个用于构建用户界面的JavaScript框架&#xff0c;用于构建“可预期的”和“声明式的”Web用户界面&#xff0c;特别适合于构建那些数据会随时间改变的大型应用的用户界面。 它起源于Facebook的内部项目&#xff0c;因为对市场上所有JavaScript MVC框架都…...

避坑指南:用Python调用腾讯混元大模型API时,你可能会遇到的5个常见错误及解决方法

避坑指南&#xff1a;用Python调用腾讯混元大模型API时&#xff0c;你可能会遇到的5个常见错误及解决方法 调试API接口就像在迷宫中寻找出口——每个转角都可能遇到意想不到的障碍。作为使用腾讯混元大模型的开发者&#xff0c;我在过去三个月里处理了超过200次API调用异常&…...

C++ constexpr 编译期优化

C constexpr 编译期优化&#xff1a;释放代码的潜在性能 在现代C开发中&#xff0c;编译期计算已成为提升程序性能的关键技术之一。constexpr关键字自C11引入以来&#xff0c;逐渐演变为一种强大的工具&#xff0c;允许开发者在编译阶段完成复杂的计算和初始化&#xff0c;从而…...

企业级大数据产品架构设计指南

企业级大数据产品架构设计指南&#xff1a;从概念到落地的完整方案 标题选项 企业级大数据架构设计全攻略&#xff1a;从0到1构建可扩展的数据平台大数据产品架构设计指南&#xff1a;如何打造高性能、高可用的企业级解决方案从理论到实践&#xff1a;企业级大数据产品架构设计…...

Umi-OCR:开源离线OCR解决方案的全方位实践指南

Umi-OCR&#xff1a;开源离线OCR解决方案的全方位实践指南 【免费下载链接】Umi-OCR Umi-OCR: 这是一个免费、开源、可批量处理的离线OCR软件&#xff0c;适用于Windows系统&#xff0c;支持截图OCR、批量OCR、二维码识别等功能。 项目地址: https://gitcode.com/GitHub_Tren…...

终极foobox-cn配置指南:如何打造专业级音乐播放体验

终极foobox-cn配置指南&#xff1a;如何打造专业级音乐播放体验 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn foobox-cn作为foobar2000的DUI&#xff08;自定义用户界面&#xff09;配置方案&#…...

OpenClaw技能市场盘点:10个适配Qwen3.5-4B-Claude的实用模块

OpenClaw技能市场盘点&#xff1a;10个适配Qwen3.5-4B-Claude的实用模块 1. 为什么需要关注技能市场&#xff1f; 去年冬天&#xff0c;当我第一次在本地部署OpenClaw时&#xff0c;最让我惊喜的不是框架本身&#xff0c;而是它背后那个不断生长的技能市场。作为一个长期被重…...

Qt 6.5 + DeepSeek API 流式聊天实战:手把手教你打造一个带记忆的桌面AI助手

Qt 6.5 DeepSeek API 流式聊天实战&#xff1a;打造带记忆的桌面AI助手 在当今软件开发领域&#xff0c;AI助手的集成已成为提升用户体验的重要趋势。想象一下&#xff0c;在你的代码编辑器或笔记软件中&#xff0c;有一个能理解上下文、实时响应且具备记忆能力的智能助手&…...

easy-connect-gr-peach:GR-PEACH多网络连接抽象库详解

1. easy-connect-gr-peach 项目概述 easy-connect-gr-peach 是专为 Renesas GR-PEACH 开发板设计的轻量级网络连接抽象库&#xff0c;属于 mbed OS 生态中 easy-connect 系统在特定硬件平台上的适配实现。其核心目标并非提供底层驱动&#xff0c;而是构建一套 统一、可配置…...

简历匹配已成过去式:AI招聘选型的避坑与实战指南

讲真&#xff0c;最近这一年&#xff0c;我听到最多的一句抱怨就是&#xff1a;“我们花了大几十万上的AI招聘系统&#xff0c;怎么用着用着&#xff0c;就只剩下‘自动筛简历’和‘群发面试通知’的功能了&#xff1f;” 在2026年这个节点&#xff0c;如果一家公司的AI招聘系统…...

WebPageTest API完全手册:自动化网站性能监控与集成

WebPageTest API完全手册&#xff1a;自动化网站性能监控与集成 【免费下载链接】WebPageTest Official repository for WebPageTest 项目地址: https://gitcode.com/gh_mirrors/we/WebPageTest WebPageTest 是一款强大的网站性能测试工具&#xff0c;其提供的 API 功能…...