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/
核心思想:分治法,利用归并排序,求归并排序左右不一样的节点
浙公网安备 33010602011771号