35数组中的逆序对

Posted 张乐乐章

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了35数组中的逆序对相关的知识,希望对你有一定的参考价值。

 

题目描述

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007

输入描述:

题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5

示例1

1,2,3,4,5,6,7,0

 

输出

7

思路:
类似于megersort

先统计子数组内部的逆序对的数目,然后再统计2个相邻子数组之间的逆序对的数目,在统计的过程中,还需要对数组排序,
排序可以避免重复统计。

 1 public class Solution {
 2     public int InversePairs(int [] a) {  
 3         int[] aux = new int[a.length];
 4         for(int i = 0;i<a.length;i++)
 5             aux[i] = a[i];
 6         
 7         return fun(a,aux,0,a.length-1);
 8     }
 9     private int fun(int[] a,int[] aux,int lo,int hi){
10         if(lo==hi) return 0;
11         int mid = (hi-lo)/2+lo;
12         int left = fun(a,aux,lo,mid)%1000000007;
13         int right = fun(a,aux,mid+1,hi)%1000000007;
14         
15         int i = mid;
16         int j = hi;
17         int ai = hi;//aux_index
18         int  count = 0;
19         while(i>=lo&&j>=mid+1){
20             if(a[i]>a[j]){
21                 aux[ai--] = a[i--];
22                 count+=j-mid;
23                 if(count>=1000000007)//数值过大求余
24                     count%=1000000007;       
25             }
26             else
27                 aux[ai--]=a[j--];
28         }
29         
30         while(i>=lo)
31             aux[ai--]=a[i--];
32         while(j>=mid+1)
33             aux[ai--] =a[j--];    
34         
35         //更新数组
36         for(int k = lo;k<=hi;k++)
37             a[k] = aux[k];
38         
39         return (left+right+count)%1000000007;
40     }
41 }

 

以上是关于35数组中的逆序对的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer35:数组中的逆序对

35.数组中的逆序对

35数组中的逆序对

35 数组中的逆序对

剑指offer35 数组中的逆序对

剑指offer[35]——数组中的逆序对