35.数组中的逆序对

Posted yjxyy

tags:

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

题目描述:

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

思路分析:

??这道题的解法十分巧妙,我们熟悉的数组排序中的归并排序,它在排序的过程中就是比较两个数的大小,如果是逆序它就交换,所以我们想求一个数组中的逆序对,就对他进行归并排序,在排序的过程中记录逆序对数。

代码:

public class Solution {
    int res;
    public int InversePairs(int [] array) {
        if(array==null||array.length==0)
            return 0;
        sort(array,0,array.length-1);
        return res%1000000007;
    }
    public void sort(int[]array,int start,int end){  //归并排序
        int mid=(start+end)/2;
        if(start<end){
            sort(array,start,mid);
            sort(array,mid+1,end);
            merge(array,start,mid,end);
        }
            
    }
    public void merge(int []array,int start,int mid,int end){
        int []temp=new int[end-start+1];
        int left=start;
        int right=mid+1;
        int k=0;
        while(left<=mid&&right<=end){
            if(array[left]<=array[right]){
                temp[k++]=array[left++];
            }else{
                temp[k++]=array[right++];
                res=res+(mid-left+1);
                res=res%1000000007;
            }
        }
        while(left<=mid){
            temp[k++]=array[left++];
        }
        while(right<=end){
            temp[k++]=array[right++];
        }
        for(int i=0;i<k;i++){
            array[start+i]=temp[i];
        }
    }
}

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

剑指Offer35:数组中的逆序对

35.数组中的逆序对

35数组中的逆序对

35 数组中的逆序对

剑指offer35 数组中的逆序对

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