码迷,mamicode.com
首页 > 编程语言 > 详细

35.数组中的逆序对

时间:2019-05-09 21:59:29      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:start   length   return   inverse   解法   pairs   merge   数字   数组   

题目描述:

??在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数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.数组中的逆序对

标签:start   length   return   inverse   解法   pairs   merge   数字   数组   

原文地址:https://www.cnblogs.com/yjxyy/p/10841038.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!