AcWing算法基础课-788逆序对的数量-Java题解

AcWing算法基础课-790数的三次方根-Java题解 本文详细介绍了一个使用二分法计算浮点数三次方根的算法。通过逐步逼近目标值,程序能够在给定的区间内精确计算出结果,并保留6位小数。文章从输入处理、二分法初始化、迭代过程到输出结果,全面解析了算法的实现步骤。 阅读详情

heweilai-bolg-title-image-of-the-article

大家好,我是何未来,本篇文章给大家讲解《AcWing算法基础课》788 题——逆序对的数量。本文详细讲解了如何通过归并排序算法高效计算数组中的逆序对数量。通过递归分治和归并过程,我们不仅实现了数组的排序,还在排序过程中巧妙地计算了逆序对的数量。文章还提供了 Java 代码实现,帮助大家更好地理解和应用这一算法。

❓题目描述

给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。

逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。

输入格式

第一行包含整数 n,表示数列的长度。

第二行包含 n 个整数,表示整个数列。

输出格式

输出一个整数,表示逆序对的个数。

数据范围

1 ≤ n ≤ 100000,
数列中的元素的取值范围 [1,109]。

输入样例:

6
2 3 4 5 6 1

输出样例:

5

💡算法思路

  1. 对数组进行归并排序
  2. 归并排序过程中计算逆序对的数量

具体实现步骤:

  • 递归分治:将数组分成两部分,分别对左半部分和右半部分进行递归排序。
  • 归并过程:
    • 使用两个指针 i 和 j 分别指向左半部分和右半部分的当前元素。
    • 比较 nums[i] 和 nums[j],将较小的元素放入临时数组 tmp 中。
    • 如果 nums[i] 大于 nums[j],计算逆序对的数量并累加到 ans 中。
    • 将剩余的元素依次放入 tmp 数组中。
    • 将 tmp 数组中的元素复制回原数组 nums。

看到这里可能你会产生疑问,为什么 nums[i] 大于 nums[j] 时,使用ans += mid - i + 1;就可以计算出逆序对的数量呢?

这是因为根据归并排序的原理,每次递归会将原数组分为左右两个子数组,先对左子数组进行递归排序,再对右子数组进行递归排序,那么我们可以知道,每一次递归结束,左子数组的所有元素一定是从小到大排列的,也就是右边的元素一定比左边的元素更大。那么我们在合并两个子数组过程中当 nums[i] 大于 nums[j] 时,它们刚好组成了一个逆序对,并且左子数组中 nums[i] 后面的元素都和 nums[j] 形成了逆序对,所以就可以计算出当前递归中有多少个逆序对,把所有次递归的逆序对数量累加起来就得到了整个数组的逆序对数量。

具体判断逻辑如下:

while (i <= mid && j <= r) {
   
    // 合并两个有序子数组
    if (a[i] <= a[j]) {
   
    // 如果左半部分的元素小于或等于右半部分的元素
        tmp[k++] = a[i++]; // 将左半部分的元素放入临时数组
    } else {
   
   
        tmp[k++] = a[j++]; // 否则将右半部分的元素放入临时数组
        // 以下为关键代码:
        // 此时a[i] > a[j],并且i < j(尚未改变两元素的顺序),说明a[i]和a[j]是一组逆序对
        // 并且左子数组是有序的,所以左子数组中a[i]以及之后的所有元素(数量为mid-i+1)都大于等于a[j]
        // 也即此次递归中,大于a[j]的元素有mid-i+1个,等价于此次递归中逆序对有mid-i+1个
        // 每次递归都进行累加,最后就可以得到所有的逆序对个数。
        ans += mid - i + 
acwing算法基础课(第一讲 基础算法)(2) 本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取。如果数组中不存在该元素,则返回“-1 -1”。输入格式第一行包含整数n和q,表示数组长度和询问个数。第二行包含n个整数(均在1~10000范围内),表示完整数组。接下来q行,每行包含一个整数k,表示一个询问元素。输出格式共q行,每行包含两个整数,表示所求元素的起始位置和终止位置。 阅读详情

相关推荐

别再只看图了!代谢组学OPLS-DA分析,R2Y和Q2Y到底怎么看才不踩坑?

本文深入解析代谢组学OPLS-DA分析中的关键指标R2Y和Q2Y,揭示如何避免过拟合陷阱。通过详细解读模型解释能力(R2Y)和预测能力(Q2Y),结合置换检验方法,提供完整的模型评估流程与实战建议,帮助研究者获得可靠的分析结果。

weixin_42638178的博客 196

传统芯片封装工艺流程简介

塑封是将工件和树脂安装在模具中,加热模具,使树脂液化充满模具,降温保持一定时间后,树脂凝结为固态即可取出。它将一个大的晶圆切割成许多单独的小块,每个小块是一个“芯片”(Chip,die),这些芯片是单个集成电路的基本单位。对裸露在外的引线框架外脚电镀Sn-Pb合金,这样不仅可以提高外脚的抗氧化性,还有利于后续与印刷电路板的焊接。导电胶粘贴法:将含有银粉的环氧树脂(银浆)涂敷在框架或基板上,再将芯片放置其上,固化后可以将芯片牢牢粘接。引线框架的各腿是用筋连接着的,起支撑作用,塑封固化后,需要将其连筋切掉。

芯想是陈的博客 3190

我的AI个人公司成立:基于Skills与Qwen大模型的智能问答平台实战开发+龙虾团队

微学AI推出数字员工矩阵,包含10个核心AI角色(总经理、秘书、工程师等),每个角色具备专属技能模块。系统采用FastAPI+Vue3技术栈,核心功能包括:基于SkillLoader的动态技能管理(支持脚本执行和文档加载)、WebSocket流式输出、多轮对话上下文管理。通过模块化架构实现AI自驱协作,可自主完成从需求分析到开发落地的全流程。项目亮点在于声明式技能配置和实时交互能力,打破传统办公壁垒,提升工作效率。

微学AI的博客 1624

基于 ESP32 的智能药盒提醒装置设计与实现

本装置基于 ESP32 实现了智能药盒的核心功能,硬件选型兼顾成本与实用性,软件设计模块化、易拓展。后续可通过 ESP32 的 WiFi 模块接入物联网平台(如阿里云、OneNet),实现远程设置提醒、服药状态反馈等功能,进一步提升智能化水平。该装置能有效解决老人忘服药问题,具有较高的实用价值与推广潜力。

weixin_42300449的博客 1043

基于OSEK_TP.dll封装通用,多ECU自由切换的诊断函数库

本文介绍了基于CANoe内置OSEK_TP.dll库实现通用诊断通讯的方法。通过封装CAN_TP.cin顶层脚本,实现了ECU连接管理、数据收发和多ECU切换功能。系统采用字典结构存储ECU参数,支持从配置文件读取诊断ID等配置信息,通过TpCreateConnection建立TP层连接。文章详细说明了诊断请求发送函数Uds_DiagSendRequest的实现逻辑,以及如何利用回调函数处理收发事件。该方法无需依赖诊断数据库,通过底层封装实现了灵活高效的诊断通讯方案,适用于车载诊断领域的测试需求。

蚂蚁小兵 1568

华为OD机试真题 新系统 9月16号 【园区基站节能部署规划】

华为OD机试真题 新系统【园区基站节能部署规划】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【园区基站节能部署规划】多语言题解。

qq_45776114的博客 353

【C++实战(62)】从0到1:C++打造TCP网络通信实战指南

本文是 C++ 网络编程实战专栏第 62 篇,聚焦 TCP 客户端与服务端开发。先阐述 TCP 协议特点、核心 API 及阻塞与非阻塞 IO 区别,打牢基础;再详解 TCP 服务端初始化、客户端连接处理与数据收发,以及客户端初始化、异常处理和协议设计;最后通过简易聊天系统实战,介绍线程池应用、协议解析及稳定性测试,助力开发者掌握 TCP 网络编程实操技能。

邓邓子的博客 999

【2026最新版】python点云处理算法汇总(长期更新版)

python点云处理算法整理。博客长期更新,最近一次更新时间为:2026年10月4日。

点云侠的博客 42万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: AcWing算法基础课-787归并排序-Java题解
下一篇: AcWing算法基础课-789数的范围-Java题解
何书悦
博客等级 码龄3年 2146粉丝 23原创
评论 144
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何书悦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值