剑指offer:(36)时间效率和空间效率的平衡 :数组中的逆序对

来源:互联网 发布:u盘安装linux卡在scsi 编辑:程序博客网 时间:2024/05/21 17:14

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

package cn.com.jianzhioffer;public class Solution36 {//public static int InversePairs(int[] array) {//int length = array.length;//return mergeSort(array, 0, length - 1);//}////private static int mergeSort(int[] data, int start, int end) {//// 递归终止条件//if (start >= end) {//return 0;//}////// 递归//int mid = (start + end) / 2;//int leftCounts = mergeSort(array, start, mid);//int rightCounts = mergeSort(array, mid + 1, end);////// 归并排序,并计算本次逆序对数//int[] copyArray = array;// 数组副本,用于归并排序//int foreIdx = mid;// 前半部分的指针//int backIdx = end;// 后半部分的指针//int counts = 0;// 记录本次逆序对数//int idxCopy = end;// 辅助数组的下标//while (foreIdx >= start && backIdx >= mid + 1) {//if (array[foreIdx] > array[backIdx]) {//copyArray[idxCopy--] = array[foreIdx--];//counts += backIdx - mid;//} else {//copyArray[idxCopy--] = array[backIdx--];//}//}////while (foreIdx >= start) {//copyArray[idxCopy--] = array[foreIdx--];//}//while (backIdx >= mid + 1) {//copyArray[idxCopy--] = array[backIdx--];//}////for (int i = start; i <= end; i++) {//array[i] = copyArray[i];//}////return (leftCounts + rightCounts + counts);//}/*归并排序的改进,把数据分成前后两个数组(递归分到每个数组仅有一个数据项),合并数组,合并时,出现前面的数组值array[i]大于后面数组值array[j]时;则前面数组array[i]~array[mid]都是大于array[j]的,count += mid+1 - i参考剑指Offer,但是感觉剑指Offer归并过程少了一步拷贝过程。还有就是测试用例输出结果比较大,对每次返回的count mod(1000000007)求余*/  public static int InversePairs(int [] array) {        if(array==null||array.length==0)        {            return 0;        }        int[] copy = new int[array.length];        for(int i=0;i<array.length;i++)        {            copy[i] = array[i];        }        int count = InversePairsCore(array,copy,0,array.length-1);//数值过大求余        return count;             }    private static 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;        int i=mid;        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;    }public static void main(String[] args) {int[] array = {1,2,3,4,5,0};System.out.println(InversePairs(array));}}


阅读全文
0 0
原创粉丝点击