数组中的逆序对

来源:互联网 发布:网络理财产品收益排名 编辑:程序博客网 时间:2024/06/10 07:11

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

思路:拆分之后将子数组排序,排序过程中计算逆序对的个数。合并到上一级继续排序和统计。

import java.util.*;public class Solution {    public int InversePairs(int [] array) {        return (int)cal(array,0,array.length-1);    }    public long cal(int[] array,int start,int end){        if(start >= end)            return 0;        int mid = (start + end) / 2;        //分成左右两个子串        long leftCount = cal(array,start,mid);        long rightCount = cal(array,mid+1,end);        long count = 0;        //从左右两个部分的后边开始遍历        int endArrow = end;        int startArrow = mid;        int[] newArray = new int[end - start +1];        int newArrayIndex = newArray.length - 1;        while(newArrayIndex >= 0){            //左右元素都存在            if(startArrow >= start && endArrow >= (mid + 1)){                if(array[startArrow] > array[endArrow]){                    newArray[newArrayIndex] = array[startArrow];                    count += endArrow - mid ;                    startArrow--;                }else{                    newArray[newArrayIndex] = array[endArrow];                    endArrow--;                }            }else            if(startArrow >= start){                newArray[newArrayIndex] = array[startArrow];                //count += end - mid + 1;                startArrow--;            }else            if(endArrow >= mid + 1){                newArray[newArrayIndex] = array[endArrow];                endArrow--;            }            newArrayIndex--;        }        for(int i = 0,j = start;i < newArray.length;i++,j++){            array[j] = newArray[i];        }        return (count + leftCount + rightCount) % 1000000007;    }}
原创粉丝点击