1. 程式人生 > >35.數組中的逆序對

35.數組中的逆序對

new 組成 public core describe des -h con for

題目描述

在數組中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個數組中的逆序對的總數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

題目解答

public class Solution {
    public int InversePairs(int [] array) {
        
if(array==null || array.length==0){ return 0; } //復制一份到array數組 int length=array.length; int[] copy=new int[length]; for(int i=0;i<length;i++){ copy[i]=array[i]; } int count=InversePairsCore(array,copy,0,length-1);
return count; } private int InversePairsCore(int[] array,int[] copy,int low,int high){ if(low==high){ return 0; } int mid=(low+high)>>1; int leftCount=InversePairsCore(array,copy,low,mid)%1000000007; int rightCount=InversePairsCore(array,copy,mid+1,high)%1000000007;
int count=0; //i初始化為前半段最後一個數字的下標 int i=mid; //j初始化為後半段最後一個數字的下標 int j=high; int locCopy=high; while(i>=low && j>mid){ if(array[i]>array[j]){ count+=j-mid; copy[locCopy--]=array[i--]; if(count>=1000000007){//數值過大求余 count%=1000000007; } }else{ copy[locCopy--]=array[j--]; } } for(;i>=low;i--){ copy[locCopy--]=array[i]; } for(;j>mid;j--){ copy[locCopy--]=array[j]; } for(int s=low;s<=high;s++){ array[s]=copy[s]; } return (leftCount+rightCount+count)%1000000007; } }

35.數組中的逆序對