51-数组中的逆序对

面试题51. 数组中的逆序对

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

示例 1:

输入: [7,5,6,4]
输出: 5
 

限制:

0 <= 数组长度 <= 50000

在归并排序中进行处理:

class Solution {
    private int count;
    private int[] temp;
    public int reversePairs(int[] nums) {
        if(nums == null || nums.length == 0) return 0;
        temp = new int[nums.length];
        mergeSort(nums,0,nums.length - 1);
        return count;
    }
    private void mergeSort(int[] nums,int l,int h){
        if(l >= h) return;
        int m = (h - l) / 2 + l;
        mergeSort(nums,l,m);
        mergeSort(nums,m + 1,h);
        merge(nums,l,m,h);
    }
    private void merge(int[] nums,int l,int m,int h){
        int i = l,j = m + 1,k = l;
        while(i <= m || j <= h){
            if(i > m){
                temp[k++] = nums[j++];
            }else if(j > h){
                temp[k++] = nums[i++];
            }else if(nums[i] <= nums[j]){
                temp[k++] = nums[i++];
            }else{
                temp[k++] = nums[j++];
                count += m - i + 1;
            }
        }
        for(int p = l;p <= h;p++){
            nums[p] = temp[p];
        }
    }
}
一回生,二回熟
原文地址:https://www.cnblogs.com/zzytxl/p/12590687.html