LeetCode求数组中的逆序对

public class Solution {

    public int reversePairs(int[] nums) {
        if (nums.length < 2) {
            return 0;
        }

        int[] temp = new int[nums.length];
        return mergeSort(nums,0, nums.length-1, temp);
    }

    private int mergeSort(int[] nums, int left, int right, int[] temp) {
        if(left < right) {
            int mid = (left + right) / 2;
            int leftNum = mergeSort(nums, left, mid, temp);
            int rightNum = mergeSort(nums, mid+1, right, temp);

            return leftNum + rightNum + merge(nums, left, mid, right, temp) ;//逆序个数等于左边逆序的个数+右边逆序的个数+左右逆序的个数
        }

        return 0;
    }

    private int merge(int[] nums, int left, int mid, int right, int[] temp) {
        int count = 0;
        int i = left ;
        int j = mid+1;
        int k = left;
        while (i<=mid && j <= right) {
            if(nums[i] <= nums[j]) {
                temp[k] = nums[i];
                i++;
            } else {
                temp[k] = nums[j];
                j++;
                count += mid-i+1;//如果有右边的小于左边的,那么就是从i到mid所有的都是逆序的
            }
            k++;
        }

        while (i <= mid) {
            temp[k] = nums[i];
            i++;
            k++;
        }

        while(j <= right) {
            temp[k] = nums[j];
            j++;
            k++;
        }

        if (right + 1 - left >= 0)
            System.arraycopy(temp, left, nums, left, right + 1 - left);

        return count;
    }
}

https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/

核心思想:分治法,利用归并排序,求归并排序左右不一样的节点

原文地址:https://www.cnblogs.com/iamzhoug37/p/12952813.html