题目描述:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
输入:
每个测试案例包括两行:
第一行包含一个整数n,表示数组中的元素个数。其中1 <= n <= 10^5。
第二行包含n个整数,每个数组均为int类型。
输出:
对应每个测试案例,输出一个整数,表示数组中的逆序对的总数。
样例输入:
7 5 6 4
样例输出:
5
思路:最简单的方法是顺序数组,将每个数字与后面的比较,统计逆序对的个数,这种方法的时间复杂度为O(n*n),剑指offer给出了归并排序的思路,这个有点难想到啊,也可能是我太弱了,根本没往这方面想!理解了思路,就不难了,将子数数组划分成两个组,再将子数组分别划分成两个子数组,统计每个子数组内的逆序对个数,并将其归并排序,再统计两个子数组之间的逆序对个数,并进行归并排序。这就是归并排序的变种,在归并排序代码的基础上稍作改进即可。
合理还要注意一点:全局变量count不能声明为int型,必须为long long型。因为题目中说数组最大为10^5,那么最大逆序对为(10^5-1)*10^5/2,这个数大约在50亿左右,超过了int型的表示范围。
#include<stdio.h>
#include<stdlib.h>
int inversePairsCore(int*,int*,int,int);
int inversePairs(int *data,int length)
{
if(data==NULL||length==0)
return 0;
int *copy = new int[length];
for(int i=0;i<length;i++)
copy[i] = data[i];
int count=inversePairsCore(data,copy,0,length-1);
delete[] copy;
return count;
}
int inversePairsCore(int* data,int *copy,int start,int end)
{
if(start==end)
{
copy[start]=data[start];
return 0;
}
int length=(end-start)/2;
int left = inversePairsCore(copy,data,start,start+length);
int right = inversePairsCore(copy,data,start+length+1,end);
int i=start+length;
int j=end;
int indexCopy = end;
int count=0;
while(i>=start&&j>=start+length+1)
{
if(data[i]>data[j])
{
copy[indexCopy--]=data[i--];
count+=j-start-length;
}
else{
copy[indexCopy--]=data[j--];
}
}
for(;i>=start;--i)
copy[indexCopy--]=data[i];
for(;j>=start+length+1;--j)
copy[indexCopy--]=data[j];
return left+right+count;
}
int main()
{
int data[]={7,5,6,4};
int length=4;
int count = inversePairs(data,length);
printf("%d\n",count);
system("pause");
return 0;
}
分享到:
相关推荐
统计数组中的逆序对的个数,基于归并排序的思想,先拆分为单个元素,再合并为两个元素的数组,组内统计后,排序,进行组建统计
数组中的逆序对.md
python python_剑指offer第35题数组中的逆序对
逆序对是排序数组中的一种概念,它是指在数组中,如果两个元素a和b的值满足a > b,但它们的下标i ,则称(a, b)为一个逆序对。逆序对的数量可以反映出数组的有序程度,是许多算法问题的基础,如快速排序、归并排序等...
总结来说,解决“数组中的逆序对”问题,主要涉及归并排序算法的应用,通过递归分解数组,再合并子数组时计算逆序对,达到在排序的同时统计逆序对数量的目的。这种方法既保证了排序的稳定性,又有效解决了问题。
Java是一种流行的编程语言,在面试中经常会出现数组中的逆序对问题。今天我们来详细介绍一下这个问题的解决方案。 什么是数组中的逆序对? 在数组中,如果前一个数字大于后一个数字,则这两个数字组成一个逆序对。...
逆序数(Inversion Count)是指在数组或序列中,如果一个大于其后面的元素,则这样的对称为逆序对。逆序数就是数组中逆序对的数量。这个概念在理解数组的有序性、数据的复杂度分析以及解决特定问题时非常有用。 ...
逆序对是数组中一种特殊的数字关系,当一个数组中存在两个数字,使得前一个数字大于后一个数字时,我们称这两个数字构成了一个逆序对。逆序对问题在计算机科学,尤其是算法分析中有着重要的应用,因为它可以用来衡量...
将一个数组逆序输出,用第一个与最后一个交换。 #!/usr/bin/python # -*- coding: UTF-8 -*- if __name__ == '__main__': a = [9,6,5,4,1] N = len(a) print a for i in range(len(a) / 2):
逆序对是指在一个排序数组(升序或降序)中,如果一个元素的值大于其后面的元素,这样的元素对就被称为逆序对。例如,在升序数组[1, 2, 3, 4, 5]中不存在逆序对,但在[5, 4, 3, 2, 1]中,所有元素对(5与4,5与3,5...
在JavaScript编程中,"数组中的逆序对"是一个常见的算法问题,主要涉及到数组操作和比较。逆序对指的是在一个数组(或序列)中,如果前面的元素大于后面的元素,则称这两个元素为一个逆序对。例如,在数组[7, 5, 6, ...
Java 简单实现数组中的逆序对 Java 中的数组是一个基本数据结构,用于存储一组相同类型的元素。数组中的逆序对是指在数组中,前一个元素大于后一个元素的对数。今天我们将讨论如何使用 Java 实现数组中的逆序对计数...
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P00000007 输入描述: 题目保证输入的...
js代码-tmp-数组中的逆序对(结果对,超时)
本主题探讨的是如何利用指针来实现数组元素的逆序操作,这是C语言程序设计中常见的任务之一,特别是在处理数据结构和算法时。下面我们将详细讨论指针、数组以及如何将它们结合起来实现数组的逆序。 首先,了解指针...
Java实现数组中的逆序对是指在数组中,两个数字的顺序与其在数组中的出现顺序相反的对数,即如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。例如,在数组{7,5,6,4}中,一共存在5对逆序对,分别...
有一实数序列a1,a2,....an,若i且ai>aj,则(ai,aj)形成了一个逆序对,请使用分治算法求整个序列中逆序对个数,并分析算法时间复杂度。
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 示例 1: 输入: [7,5,6,4] 输出: 5 限制: 0 <= 数组长度 <= 50000 首先最...
即输出P%1000000007输入描述:题目保证输入的数组中没有的相同的数字数据范围:对于%50的数据,size^4对于%75的数据,size^