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