题目描述

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


题目链接:

https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5?tpId=13&tqId=11188&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

 

 

 

归并排序

public class Solution {
    private int count =0;
    public int InversePairs(int [] array) {
        if(array.length == 0){
            return 0;
        }
        recursive(array,new int[array.length],0,array.length - 1);
        return count;
    }
    //归并排序
    public void recursive(int[] arr,int[] tarr,int left,int right){
        if(left == right){
            return;
        }
        int mid = (left + right)/2;
        //左边排序
        recursive(arr,tarr,left,mid);
        //右边排序
        recursive(arr,tarr,mid+1,right);
        int m = left,n = mid+1;
        for(int i = left;i <= right;i++){
            //左右两个子数组依次排列
            if(arr[m] >= arr[n]){
                tarr[i] = arr[n];
                n++;
                count += mid - m + 1;
                count %= 1000000007;
            }else{
                tarr[i] = arr[m];
                m++;
            }
            //只剩右边子数组时
            if(m>mid){
                while(n<=right){
                    tarr[++i]=arr[n++];
                }
                break;
            }
            //只剩左边子数组时
            if(n>right){
                while(m<=mid){
                    tarr[++i]=arr[m++];
                }
                break;
            }
        }
        for(int i = left;i<=right;i++){
            arr[i] = tarr[i];
        }
    }
}

 

 

 

插入排序:过75%数据

public class Solution {
    public int InversePairs(int [] array) {
        if(array.length<=1){
            return 0;
        }
        int count = 0;
        for(int i = 1;i < array.length;i++){
            for(int j = i - 1;j >= 0;j--){
                if(array[j] > array[j+1]){
                    count++;
                    swap(array,j+1,j);
                }else{
                    break;
                }
            }
            count%=1000000007;
        }
        return count;
    }
    
    public void swap(int[] arr,int i,int j){
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
}

 

posted on 2020-06-09 00:52  MoonBeautiful  阅读(63)  评论(0编辑  收藏  举报