class Solution {
public int reversePairs(int[] nums) {
// base case
if (nums.length < 2) return 0;
mergeSort(nums, 0, nums.length - 1);
return count;
}
/* 归并 */
public void mergeSort(int[] nums, int left, int right) {
if (left == right) return;
int mid = left + (right - left) / 2;
mergeSort(nums, left, mid);
mergeSort(nums, mid + 1, right);
merge(nums, left, mid, right);
}
int count = 0; //逆序对数量
public void merge(int[] nums, int left, int mid, int right) {
int i = left, j = mid + 1;
int[] temp = new int[right - left + 1];
int index = 0;
while (i <= mid && j <= right) {
if (nums[j] < nums[i]) { // 注意:> !!!!!
count += (mid - i + 1);
temp[index++] = nums[j++];
} else {
temp[index++] = nums[i++];
}
}
while (i <= mid) temp[index++] = nums[i++];
while (j <= right) temp[index++] = nums[j++];
for (int t : temp) nums[left++] = t; // 将排序后的临时数组元素 拷贝到原数组
}
}
LeetCode篇(归并排序题型详解 陆续更新中)
最新推荐文章于 2023-02-08 22:41:32 发布