Acwing---788.逆序对的数量

逆序对的数量

  • 1.题目
  • 2.基本思想
  • 3.代码实现

1.题目

给定一个长度为 n n n 的整数数列,请你计算数列中的逆序对的数量。逆序对的定义如下:对于数列的第 i i i个和第 j j j 个元素,如果满足

i < j i<j i<j a [ i ] > a [ j ] a[i]>a[j] a[i]>a[j] ,则其为一个逆序对;否则不是。

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

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

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

数据范围
1 ≤ n ≤ 100000 1≤n≤100000 1n100000,数列中的元素的取值范围 [ 1 , 1 0 9 ] [1,10^9] [1,109]

输入样例:

6
2 3 4 5 6 1

输出样例:

5

2.基本思想

法1:双重for暴力 ——> 时间超时 O(n^2)

法2: 归并排序

基于归并排序的解法
一种高效的计算逆序对的方法是使用修改后的归并排序算法。基本思想是将数组分割为较小的子数组,递归地对它们进行排序,然后在合并过程中计算逆序对。

  • 归并排序步骤:将数组递归地分割为两半,直到每个子数组只有一个元素。然后,将子数组按照排序顺序合并回来,同时在合并过程中计算逆序对。

  • 合并过程中计算逆序对:在合并两个已排序的子数组时,如果发现逆序对(即 arr[i] > arr[j]),则将逆序对的数量递增为第一个子数组中剩余的元素数量(即 (mid - i + 1),其中 mid 是合并的子数组的中间索引)。

  • 这是因为在合并过程中,如果左边的子数组元素 arr[i] 大于右边的子数组元素 arr[j],则 arr[i] 大于右边子数组中的所有元素,形成逆序对。

示例

假设一个数组 arr = [4, 3, 2, 1]。

使用基于归并排序的方法,我们可以如下计算逆序对的数量:

初始数组:[4, 3, 2, 1]

归并排序步骤1:[4, 3, 2, 1] -> [4, 3], [2, 1]

归并排序步骤2:[4, 3], [2, 1] -> [4], [3], [2], [1]

归并排序步骤3:合并 [4], [3],得到[3, 4]

合并过程中计算逆序对: [4][3] 合并,总逆序对数量 = 1(因为 4 > 3 且 且 4 后面没有其他元素)

归并排序步骤4:合并 [2], [1], 得到[1, 2]

合并过程中计算逆序对:[2] [1] 合并,总逆序对数量 = 1(因为 2 > 1 且 且 2 后面没有其他元素)

归并排序步骤5:[3, 4], [1, 2] -> [1, 2, 3, 4]

合并过程中计算逆序对:[3, 4] [1, 2] 合并,总逆序对数量 = 4(最开始 3 和 1 比较,因为3 > 1, 所以逆序对为 mid - l + 1 = 1 - 0 + 1 = 2 个。 接下来3 与 2 比较:因为3 > 2, 所以逆序对为 mid - l + 1 = 1 - 0 + 1 = 2 个。)

最终逆序对数量:1 + 1 + 2 + 2 = 6

  • 时间复杂度:该方法的时间复杂度为 O(n log n)。

3.代码实现

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[] arr = new int[n];for (int i = 0; i < n; i++) arr[i] = sc.nextInt();System.out.println((merge_sort(arr, 0, n - 1)));}private static long merge_sort(int[] arr, int l, int r) {if (l >= r) return 0;int mid = (l + r) >> 1;long res = 0;//子序列归并res += merge_sort(arr, l, mid) + merge_sort(arr, mid + 1, r);int i = l, j = mid + 1, k = 0;int[] temp = new int[r - l + 1];while (i <= mid && j <= r) {if (arr[i] <= arr[j]) temp[k++] = arr[i++];else {temp[k++] = arr[j++];res += mid - i + 1;}}while (i <= mid) temp[k++] = arr[i++];while (j <= r) temp[k++] = arr[j++];for (i = l, j = 0; i <= r; i++, j++) arr[i] = temp[j];return res;}
}

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

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

相关文章

基于云原生技术栈构建企业统一基础技术平台(总纲)

一、概述 本文主要介绍基于云原生技术栈建设企业技术平台的总纲&#xff0c;该技术平台对业务应用全生命周期进行管理和支撑&#xff0c;提供从需求交付、生产运行、稳定保障、资产运营&#xff0c;以及安全生产的体系化解决方案&#xff0c;为企业自建或采购技术平台提供参考。…

【嵌入式学习】C++QT-Day2-C++基础

笔记 见我的博客&#xff1a;https://lingjun.life/wiki/EmbeddedNote/19Cpp 作业 自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度…

day02 有序数组平方、长度最小的子数组、螺旋矩阵II

题目链接&#xff1a;leetcode977-有序数组平方&#xff0c;leetcode209-长度最小的子数组, leetcode59-螺旋矩阵II 有序数组平方 解题思路&#xff1a;双指针法&#xff0c;left, right 1&#xff09;创建一个等长的新数组 2&#xff09;left从左到右扫描数组&#xff0c;ri…

【卡梅德生物】稳定细胞系构建|构建流程

在生物技术领域&#xff0c;稳定细胞系的构建是研究、药物开发和生产过程中关键的一环。稳定细胞系不仅为基因表达提供了可靠的平台&#xff0c;还在生物制药、基因治疗等领域发挥着重要作用。本文将介绍稳定细胞系构建的背景、主要类型、构建流程、技术优势&#xff0c;并强调…

考研机试 手机键盘

考研机试手机键盘 用到map工具 具体键入规则和花费时间如下描述&#xff1a; 对于同一键上的字符&#xff0c;例如 a,b,c都在 “1” 键上&#xff0c;输入 a 只需要按一次&#xff0c;输入 c需要连续按三次。 如果连续两个字符不在同一个按键上&#xff0c;则可直接按&#…

数据校验和错误检测

在数据通信和存储的过程中&#xff0c;保证数据的完整性和准确性至关重要。为此&#xff0c;采用了各种校验和错误检测方法&#xff0c;以提高数据传输的可靠性。本文将介绍校验位、循环冗余检查&#xff08;CRC&#xff09;和前向纠错&#xff08;FEC&#xff09;这三种常用的…

C++ 数论相关题目(欧拉函数、筛法求欧拉函数)

1、欧拉函数 给定 n 个正整数 ai &#xff0c;请你求出每个数的欧拉函数。 欧拉函数的定义 1∼N 中与 N 互质的数的个数被称为欧拉函数&#xff0c;记为 ϕ(N) 。 若在算数基本定理中&#xff0c;Npa11pa22…pamm &#xff0c;则&#xff1a; ϕ(N) Np1−1p1p2−1p2…pm−1p…

Salesforce Lightning 的 Close Case 按钮无法批量关闭 Case 的原因和解决方法

为 Lightning 页面添加了自定义的 Close Case 按钮&#xff08;方法可参考&#xff1a;https://www.simplysfdc.com/2021/01/salesforce-mass-close-case.html&#xff09;后&#xff0c;可能会出现无法批量关闭 Case 的情况。 选中多个 Case&#xff0c;再点击 Close Case 按…

全球软件供应链安全指南和法规

软件供应商和用户&#xff0c;都需要对有效抵御软件供应链攻击的要求和法规越来越熟悉。 供应链安全继续在网络安全领域受到重点关注&#xff0c;这是有充分理由的&#xff1a;SolarWinds、Log4j、Microsoft和Okta软件供应链攻击等事件&#xff0c;持续影响着头部软件供应商以…

基于Springboot的影城管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的影城管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

JAVA笔记16--线程

进程 进程是处于运行过程中的程序&#xff0c;具有独立的功能&#xff0c;是系统进行资源分配和调度的独立单位。 独立性 进程是系统重独立存在的实体&#xff0c;它拥有自己独立的资源&#xff0c;每个进程都拥有自己私有的地址空间&#xff0c;在没有经过进程本身允许的情…

leetcode1237. 找出给定方程的正整数解

1237. 找出给定方程的正整数解https://leetcode.cn/problems/find-positive-integer-solution-for-a-given-equation/ 难度中等 101 给你一个函数 f(x, y) 和一个目标结果 z&#xff0c;函数公式未知&#xff0c;请你计算方程 f(x,y) z 所有可能的正整数 数对 x 和 y。满…

在线教育系统源码深度剖析:从零开始开发一款企业培训APP

下文&#xff0c;笔者将与大家一起深入研究在线教育系统源码&#xff0c;同时探究从零开始开发一款面向企业培训的APP所涉及的关键技术和流程。 一、背景介绍 企业培训是组织内部不可或缺的一环&#xff0c;而在线教育系统通过数字化手段&#xff0c;使培训更加灵活、个性化。…

深度学习与图像描述生成——看图说话(3)

目录 一、整体架构 二、学习策略 2.1 监督学习 2.2 无监督学习 2.3 强化学习 三、特征映射 3.1 定义 3.2 原理 3.3 关键技术 3.4 重要案例 3.5 特别注意下特征空间这一概念 四、语言模型 4.1 定义与原理 4.2 关键技术 4.3 重要性与作用 4.4 案例与应用 五、注…

访问网站时IP被阻止?5个解决方法

相信很多人遇到过IP禁令&#xff1a;比如你在访问社交媒体、搜索引擎或电子商务网站时会被限制访问&#xff0c;又或者你的的账号莫名被封&#xff0c;这些由于网络上的种种限制我们经常会遭遇IP被封的情况&#xff0c;导致无法使用继续进行网络行动。在本文中&#xff0c;我们…

SpringBoot集成Milvus2.3.4(2) |(实现向量的增删改查)

SpringBoot集成Milvus2.3.4(2) |(实现向量的增删改查) 文章目录 SpringBoot集成Milvus2.3.4(2) |(实现向量的增删改查)@[TOC]前言一、Milvus数据库的新增1.新增数据二、Milvus删除数据1.删除数据三、Milvus更新数据1.更新数据四、Milvus查询数据1.查询数据总结章节 第一…

704.二分查找(力扣LeetCode)

704.二分查找&#xff08;力扣LeetCode&#xff09; 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums…

【Mysql】数据库如何查询按 list 集合顺序的记录

场景 现在要在数据库中查询id在 list<String> 集合中记录&#xff0c;结果并按 list<String> 集合中顺序进行排序。 解决方案&#xff1a; field()函数 field() 函数的返回值是value在值列表中的索引位置。此函数执行不区分大小写的搜索。如果在值列表中找不到v…

红帽认证有啥用?初级红帽认证证书值得考吗?

大家好&#xff0c;这里是G-LAB IT实验室。 今天我们来了解一下Linux红帽认证。 红帽认证已成为企业和个人竞相追逐的热门资质。 红帽认证认可度究竟如何?红帽RHCSA认证含金量又有多高? 下面G-LAB将为你一一解答。 1 、红帽认证认可度怎么样&#xff1f; 事实上&#xff0…

钉钉互动卡片对接-普通互动卡片接入流程

这里写目录标题 一、创建内部应用二、搭建普通卡片模板三、调用互动卡片服务端接口接口报文一、发送卡片二、更新卡片三、获取token 一、创建内部应用 登录开发者后台&#xff0c;创建内部应用。 例如 百度-内部测试获取AppKey和AppSecret&#xff0c; 获取应用访问凭证获取企…