东寻

导航

数组中的逆序对

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

输入描述:
题目保证输入的数组中没有的相同的数字。

数据范围:

对于%50的数据,size<=10^4

对于%75的数据,size<=10^5

对于%100的数据,size<=2*10^5

思路

分治法,归并排序。
时间复杂度O(nlgn),空间复杂度O(n)。

代码

public class Solution {
    private int val;
    
    private int[] tmp;
    
    //二路归并
    private void divide(int[] arr, int start, int end) {
        if(start >= end) return;
        int mid = (start + end) >> 1;
        divide(arr, start, mid);
        divide(arr, mid + 1, end);
        merge(arr, start, mid, end);
    }
    
    //归并排序
    private void merge(int[] arr, int start, int mid, int end) {
        int k = 0, l = start, r = mid + 1;
        while(l <= mid && r <= end) {
            //原归并排序的核:tmp[k++] = arr[l] < arr[r] ? arr[l++] : arr[r++];
            if(arr[l] > arr[r]) {
                val = (val + mid + 1 - l)%1000000007;
                tmp[k++] = arr[r++];
            } else {
                tmp[k++] = arr[l++];
            }
        }
        while(l <= mid)    tmp[k++] = arr[l++];
        while(r <= end)    tmp[k++] = arr[r++];
        for(int i = start; i <= end; i++) {
            arr[i] = tmp[i-start];
        }
    }
    
    public int InversePairs(int [] array) {
        if(array == null || array.length == 0) return 0;
        val = 0;
        tmp = new int[array.length];
        divide(array, 0, array.length-1);
        return val;
    }
}

笔记

递归先写递归出口,再写递归运行框架,最后实现递归操作细节。

posted on 2020-02-24 14:24  东寻  阅读(152)  评论(0编辑  收藏  举报