`
u010815305
  • 浏览: 30163 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

数组中出现的逆序对

 
阅读更多
题目描述:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
输入:
每个测试案例包括两行:
第一行包含一个整数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

    数组中的逆序对.md

    python-剑指offer第35题数组中的逆序对

    python python_剑指offer第35题数组中的逆序对

    逆序对(树状数组) C语言

    逆序对是排序数组中的一种概念,它是指在数组中,如果两个元素a和b的值满足a &gt; b,但它们的下标i ,则称(a, b)为一个逆序对。逆序对的数量可以反映出数组的有序程度,是许多算法问题的基础,如快速排序、归并排序等...

    剑指Offer 51.数组中的逆序对(csdn)————程序.pdf

    总结来说,解决“数组中的逆序对”问题,主要涉及归并排序算法的应用,通过递归分解数组,再合并子数组时计算逆序对,达到在排序的同时统计逆序对数量的目的。这种方法既保证了排序的稳定性,又有效解决了问题。

    java面试题之数组中的逆序对

    Java是一种流行的编程语言,在面试中经常会出现数组中的逆序对问题。今天我们来详细介绍一下这个问题的解决方案。 什么是数组中的逆序对? 在数组中,如果前一个数字大于后一个数字,则这两个数字组成一个逆序对。...

    求数组的逆序数

    逆序数(Inversion Count)是指在数组或序列中,如果一个大于其后面的元素,则这样的对称为逆序对。逆序数就是数组中逆序对的数量。这个概念在理解数组的有序性、数据的复杂度分析以及解决特定问题时非常有用。 ...

    数组中的逆序对(通过归并过程统计)1

    逆序对是数组中一种特殊的数字关系,当一个数组中存在两个数字,使得前一个数字大于后一个数字时,我们称这两个数字构成了一个逆序对。逆序对问题在计算机科学,尤其是算法分析中有着重要的应用,因为它可以用来衡量...

    python3中数组逆序输出方法

    将一个数组逆序输出,用第一个与最后一个交换。 #!/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):

    js代码-tmp--数组中的逆序对-改

    逆序对是指在一个排序数组(升序或降序)中,如果一个元素的值大于其后面的元素,这样的元素对就被称为逆序对。例如,在升序数组[1, 2, 3, 4, 5]中不存在逆序对,但在[5, 4, 3, 2, 1]中,所有元素对(5与4,5与3,5...

    js代码-tmp-数组中的逆序对(wasted)

    在JavaScript编程中,"数组中的逆序对"是一个常见的算法问题,主要涉及到数组操作和比较。逆序对指的是在一个数组(或序列)中,如果前面的元素大于后面的元素,则称这两个元素为一个逆序对。例如,在数组[7, 5, 6, ...

    java简单实现数组中的逆序对

    Java 简单实现数组中的逆序对 Java 中的数组是一个基本数据结构,用于存储一组相同类型的元素。数组中的逆序对是指在数组中,前一个元素大于后一个元素的对数。今天我们将讨论如何使用 Java 实现数组中的逆序对计数...

    【剑指Offer】35.数组中的逆序对(Python实现)

    在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P00000007 输入描述: 题目保证输入的...

    js代码-tmp-数组中的逆序对(结果对,超时)

    js代码-tmp-数组中的逆序对(结果对,超时)

    C语言——借助指针实现数组元素的逆序.zip

    本主题探讨的是如何利用指针来实现数组元素的逆序操作,这是C语言程序设计中常见的任务之一,特别是在处理数据结构和算法时。下面我们将详细讨论指针、数组以及如何将它们结合起来实现数组的逆序。 首先,了解指针...

    java实现数组中的逆序对

    Java实现数组中的逆序对是指在数组中,两个数字的顺序与其在数组中的出现顺序相反的对数,即如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。例如,在数组{7,5,6,4}中,一共存在5对逆序对,分别...

    分治法求数组中的逆序数

    有一实数序列a1,a2,....an,若i且ai&gt;aj,则(ai,aj)形成了一个逆序对,请使用分治算法求整个序列中逆序对个数,并分析算法时间复杂度。

    算法设计之分治思想(求数组的逆序对)

    在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 示例 1: 输入: [7,5,6,4] 输出: 5 限制: 0 &lt;= 数组长度 &lt;= 50000 首先最...

    DmrfCoder#AlgorithmAndDataStructure#数组中的逆序对1

    即输出P%1000000007输入描述:题目保证输入的数组中没有的相同的数字数据范围:对于%50的数据,size^4对于%75的数据,size^

Global site tag (gtag.js) - Google Analytics