面试经典(9)--求数组的逆序对

51. 数组中的逆序对 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。归并排序的过程中,如果左边的数大于右边的数,则右边的数与 左边的数之后的数 都构成逆序对。 阅读详情

题目描述: 数组中如果前面一个数字大于后面的数字,则这俩个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。面试直接让写归并排序感觉有点傻,还是考察归并排序迁移能力的题目比较好。

算法分析:

首先最先想到的顺序扫描整个数组,这样的复杂度是o(n2),没什么思维含量。我们先退一步抽象出另外一个问题,假设有个长度为n的数组A,前面n/2个元素是有序的,后面的n/2也是有序的,能不能在线性的时间内得到数组A的逆序对数目,如果可以的话,借用归并排序的思想就可以用o(nlogn)求得一个数组的逆序数。

下面来分析如何统计相邻有序数组的逆序对数目。用下标分别指向有序数组的开端,设下标分别为i,j。

(a)


(b)


(c)


(d)

规律:copy[i]<=copy[j],将i下标对应的数据放到临时数组,并将i++;否则将j下标对应的数据放到临时数组当中,j++,并且这个时候会产生mid-i+1个逆序对。


代码如下:

long  int count=0;

int Merge(int *data,int *copy,int beg,int mid,int end)
{
	int inversion=0;
	memcpy(copy,data,sizeof(int)*(end-beg+1));
	int i=beg;
	int j=mid+1;
	int k=beg;

	while(i<=mid && j<=end)
	{
		if(copy[i]<=copy[j])
			data[k++]=copy[i++];
		else
		{
			data[k++]=copy[j++];
			inversion+=(mid-i+1);
		}
	}
	while(i<=mid)
		data[k++]=copy[i++];
	while(j<=end)
		data[k++]=copy[j++];
	return inversion;
	
}

int MergeInversion(int *data,int *copy,int beg,int end)
{
	int inversion=0;
	if(beg<end)
	{
		int mid=(beg+end)>>1;
		inversion+=MergeInversion(data,copy,beg,mid);
		inversion+=MergeInversion(data,copy,mid+1,end);
		inversion+=Merge(data,copy,beg,mid,end);
	}
	return inversion;
}


告别以太网瓶颈:手把手教你为AI训练集群搭建InfiniBand网络(以NVIDIA DGX A100/H100为例) 本文详细指导如何为AI训练集群搭建InfiniBand网络,解决以太网瓶颈问题,特别针对NVIDIA DGX A100/H100系统。通过硬件选型、网络架构设计和性能调优,显著提升多机多卡训练效率,适用于大规模模型训练场景。 阅读详情

相关推荐

LNA设计学习心得记录----MOS管的选取

LNA设计学习心得---MOS管的选取仿真

weixin_40359668的博客 6125

27_逆序memcpy 实现逆序的Memcpy方法

27_逆序memcpy 实现逆序的Memcpy方法

astruggle___的博客 1219

关于RTP时间戳以及播放器对时间戳的处理

首先,了解时间戳几个基本概念: 时间戳单位:时间戳计算的单位不是秒之类的单位,而是由采样频率所代替的单位,这样做的目的就是为了是时间戳单位更为精准。比如说一个音频的采样频率为8000Hz,那么我们可以把时间戳单位设为1 / 8000。 时间戳增量:相邻两帧之间的时间差(以时间戳单位为基准)。 采样频率: 有些地方也叫时钟频率,即 每秒钟抽取样本的次数,例如音频的采...

toshiba689的专栏 3052

【分治】求逆序对个数并打印逆序对

如果用最hick的方法去求那么就是O(n^2)的复杂度,如果想优化的话,用归并排序的方法分治处理。 主要思想:总逆序=左边逆序+右边逆序+左边右边分别排序后的逆序  #include #include using namespace std; //用归并排序的思想来求,归并排序为O(nlogn)的时间复杂度,比暴力的O(n^2)会好。 int merge(int *a, int

pipi666661的专栏 2323

Win10下Altera USB-Blaster驱动安装详解:禁用数字签名与排查指南

在嵌入式开发和FPGA调试过程中,驱动安装是工程师绕不开的环节,尤其是当操作系统对驱动签名有严格限制时,硬件往往无法被正常识别。数字签名是系统验证驱动程序来源和完整性的重要机制,Win10出于安全考虑,默认拒绝加载未经签名的驱动,这正是Altera USB-Blaster下载器在设备管理器中显示未知设备或黄色感叹号的根本原因。通过理解设备管理器的排查逻辑,掌握临时禁用驱动强制签名或开启测试模式的方法,配合正确的驱动文件路径选择与手动安装操作,即可解决Quartus无法检测到下载器的问题。这一流程同样适用于许

weixin_29164497的博客 245

逆向拆解dy接口a_bogus 1.0.1.19版本核心算法(纯算版)第二部分

本文深入解析了dy接口a_bogus 1.0.1.19版本的核心算法,重点介绍了逆向分析的基础方法论、魔改Base64编码识别与还原、随机数生成与位运算解析等关键技术。通过详细的代码示例和实用技巧,帮助开发者掌握逆向工程中的关键步骤,特别是针对a_bogus参数的生成逻辑和混淆处理。

weixin_29288313的博客 406

刷题笔记20——(归并、暴力)打印数组中的逆序对及个数

题目描述 在一个数组中, 左边的数如果比右边的数大, 则折两个数构成一个逆序对, 请打印所有逆序对和个数 解法1:暴力法 解法2:归并法 测试结果及代码 #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; using namespace s...

优快云_dzh的博客 657

Unity 横版游戏开发天花板?状态机、联机同步与横版动作游戏架构全都有

在 Unity 横版动作游戏开发领域,最耗时间的往往不是角色移动,而是整套“可扩展架构”的搭建。包括角色状态管理、敌人 AI、武器系统、关卡编辑器、联机同步、输入适配、UI 与存档系统等。2D Action Platformer Kit 的核心价值,并不只是“提供素材”,而是它已经帮开发者搭好了一整套适用于横版动作游戏的底层框架。

2403_88403568的博客 424

逆序打印数组中的元素

2.根据上图首先创建 i=0 j=len-1,用于显示数组的下标,然后使用while循环进行逆序操作,先创建一个tmp用于保存arr[0]的数据,即int tmp = arr[i],接着将arr[4]的数据变为arr[0]位置的数据,即arr[i] = arr[j],最后将tmp变为arr[4]位置的数据 ,即arr[j] = tmp。实现Reverse() 函数完成数组元素的逆置。实现函数Append() 初始化数组为全0。实现Print() 打印数组的每个元素。

2203_75422717的博客 443

Spring AI Alibaba实战训练营-13语音生成应用开发指南

本文介绍了如何基于Spring AI Alibaba创建DashScope语音应用,支持文本转语音(TTS)和语音转文本(STT)功能。主要内容包括:1)环境准备要求Java 17+、Maven 3.6+及阿里云DashScope API Key;2)通过Spring Initializr创建项目并配置相关依赖;3)设置API密钥的安全配置方法;4)实现语音合成的同步和流式功能,包括创建控制器类、调用API接口及保存语音文件。文章提供了详细的代码示例和配置说明,帮助开发者快速搭建语音处理应用。

program哲学 403

Codex 接入国产大模型完整指南:CC-Switch 与 Codex++ 的工程化选型

Codex 默认走 OpenAI Responses API,而 DeepSeek、GLM、Kimi 等国产模型只提供 OpenAI-compatible 的 Chat Completions——两套协议在消息结构、流式响应、reasoning 字段、tool call 上都不兼容,所以"改个 Base URL + 填国产 Key"这种朴素操作根本跑不通。本文从架构师视角出发,把 Codex 接入国产大模型这件事讲透:先剖析协议链路到底卡在哪,再对比 CC-Switch和 Codex++两套主流方案的差异

少说,多做 3847

算法之路_7、逆序对问题

一、问题 在一个数组中,左边的数如果比右边的数大,则折两个数构成一个逆序对,请打印所有逆序对。 二、解析 如果前一篇小和问题能够理解,那么这个逆序对问题也就可以迎刃而解了。两个问题其实差不多,只不过换了种说法。 三、代码 package algorithm; /* *2019年1月11日 */ public class Code_Inverse { public stati...

郭岚的博客 1万+

11、系统稳定性分析与李雅普诺夫函数的应用

本文深入探讨了李雅普诺夫函数在系统稳定性分析中的核心作用,重点介绍了时变与时不变系统的稳定性判据差异,以及巴尔巴拉特引理在处理非自治系统中的应用。文章还阐述了正线性系统与严格正实传递函数的性质及其在非线性控制系统中的重要性,并展示了李雅普诺夫函数在评估主导时间常数和设计快速干扰抑制控制策略方面的实际应用。通过具体示例和流程图,系统地总结了李雅普诺夫方法在稳定性分析、性能评估与控制器设计中的多维度价值,同时指出了当前挑战与未来发展方向。

Jerry的专栏 93

LeetCode 面试题51. 数组中的逆序对

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

一起加油 4807

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

校招算法笔面试 | 数组中的逆序对

牛客题库题解

wc529065的博客 1043

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Python面试宝典第38题:数组中的逆序对

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

hope_wisdom的技术博客 1373

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

c语言数组求逆序对,LeetCode 面试题51. 数组中的逆序对

面试题51. 数组中的逆序对题目来源:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/题目在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。示例 1:输入: [7,5,6,4]输出: 5解题思路思路:归并排序归并排序使用了分治的思想,这个过程需要...

weixin_39751076的博客 752

剑指Offer - 面试题51. 数组中的逆序对(归并排序,求逆序对)

1. 题目 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 示例 1: 输入: [7,5,6,4] 输出: 5 限制: 0 <= 数组长度 <= 50000 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-...

Michael是个半路程序员 1665

“剑指offer“中的经典算法面试题--数组中的逆序对数量

关于 "剑指offer"中的经典算法面试题--数组中的逆序对数量 的讨论和分析

2301_78130680的博客 152

剑指offer面试题51(java版):数组中的逆序对

welcome to my blog 剑指offer面试题51(java版):数组中的逆序对 暴力解(不通过) 写一写暴力解感受感受 public class Solution { public int InversePairs(int [] array) { //input check if(array.length<1) ...

littlehaes的博客 1473

算法面试_无序数组的逆序对问题

题目:在无序数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 例子:输入数组[7,5,6,4],一共有5个逆序对,分别是[7,5],[7,6],[7,4],[5,4],[6,4]。 思路:先把数组分隔成子数组,统计出子数组内部的逆序对的数目,然后再统计出两个相邻子数组之间的逆序对的数目。在统计逆序对的过程中,还需要对数组进行...

Rocky Ding相信人工智能、数据科学、商业逻辑、金融工具、终身成长以及顺应时代的潮流会赋予我们超能力。 953

【算法学习】归并排序算法思想的应用—求逆序对数量

通过这篇文章,我们不仅学习了如何用归并排序的思想高效解决求逆序对数量的问题,还了解了暴力解法和优化解法之间的差异。希望你能从中有所收获,并在算法的学习道路上越走越远!🚀如果你有任何问题或想法,欢迎在评论区留言,我们一起讨论!😄🎉。

Huazzi的博客 1331

面试题目51:数组中的逆序对

题目描述: 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。 输入一个数组,求出这个数组中的逆序对的总数。 样例: 输入:[1,2,3,4,5,6,0] 输出:6 解题一:暴力解法 时间复杂度为O(n*n) public int InversePairs(int [] array) { int res=0; for...

weixin_39466563的博客 376

面试题51. 数组中的逆序对--leecode

面试题51. 数组中的逆序对 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 题目链接 代码 class Solution { public: typedef struct node{ int val,index; node(int a,int b){ va...

free1993的博客 246

可视化图解算法43:数组中的逆序对

对于数据结构与算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。

weixin_42117918的博客 1051

中求解数组中元素个数_手撕面试官:归并应用求数组中逆序对的个数

正在找工作的猿六凯在投出无数份简历后,准备打开电脑看会电影放松下。突然接到面试官的电话,急忙跑到厕所接听。黑脸面试官小猿同学,看你的简历说算法掌握的比较扎实,我来给你出道算法题。黑脸面试官有一个数组,如果前面一个数字大于后面的数字,那么这两个数子构成逆序对。输入数组中元素的个数和这个数组,求出这个数组中的逆序对的总数。猿六凯没听太懂,你再解释解释呗。黑脸面试官假设我们的数组是[7...

weixin_35260789的博客 140
上一篇: 面试经典(10)--归并排序
下一篇: 面试经典(8)--树的子结构
OS技术解密
博客等级 码龄16年 3760粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值