分治思想
解题思路
-
借助归并排序统计逆序数,而计算逆序数就发生在排序的过程中,利用了「升序排序」以后数组的有序性;
-
前面「分」的时候什么都不做,「合」的过程中计算「逆序对」的个数;
-
下面看下具体某一次合并的的判断过程:
复杂度
-
时间复杂度
O(NlogN)
: 其中 N 为数组长度;归并排序使用O(NlogN)
时间; -
空间复杂度
O(N)
: 辅助数组 tmp 占用O(N)
大小的额外空间
代码实现
var reversePairs = function (record) {
let count = 0;
const merge = (nums, left, mid, right) => {
const tmpArr = new Array(right - left + 1);
let i = left;
let j = mid + 1;
let k = 0;
while (j <= right && i <= mid) {
if (nums[i] <= nums[j]) {
tmpArr[k++] = nums[i++];
} else {
tmpArr[k++] = nums[j++];
count += (mid - i + 1);
}
}
while (i <= mid) {
tmpArr[k++] = nums[i++];
}
while (j <= right) {
tmpArr[k++] = nums[j++];
}
for (let i = 0; i < tmpArr.length; i++) {
nums[i + left] = tmpArr[i];
}
};
const mergeSort = (nums, left, right) => {
if (left >= right) return;
let mid = (left + right) >> 1;
mergeSort(nums, left, mid);
mergeSort(nums, mid + 1, right);
merge(nums, left, mid, right);
};
mergeSort(record, 0, record.length - 1);
return count;
};
leetcode🧑💻 442. 数组中重复的数据
上一篇