add: 只出现一次的数字等
This commit is contained in:
53
src/array/reverse-pairs.js
Normal file
53
src/array/reverse-pairs.js
Normal file
@ -0,0 +1,53 @@
|
||||
let count = 0
|
||||
|
||||
export const resetCount = () => {
|
||||
count = 0
|
||||
}
|
||||
|
||||
/**
|
||||
* 归并排序 - 合并左右
|
||||
* @param {number[]} left
|
||||
* @param {number[]} right
|
||||
*/
|
||||
export const merge = (left, right) => {
|
||||
const res = []
|
||||
const leftLength = left.length
|
||||
const rightLength = right.length
|
||||
for (
|
||||
let index = 0, l = 0, r = 0;
|
||||
index < leftLength + rightLength;
|
||||
index++
|
||||
) {
|
||||
if (l >= leftLength) res[index] = right[r++]
|
||||
else if (r >= rightLength) res[index] = left[l++]
|
||||
else if (left[l] <= right[r]) res[index] = left[l++]
|
||||
else {
|
||||
res[index] = right[r++]
|
||||
count += leftLength - l // 唯一与归并排序有差异的地方
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
/**
|
||||
* 归并排序
|
||||
* @param {number[]} nums
|
||||
*/
|
||||
export const mergeSort = (nums) => {
|
||||
if (nums.length < 2) return nums
|
||||
const mid = ~~(nums.length / 2)
|
||||
const left = nums.slice(0, mid)
|
||||
const right = nums.slice(mid)
|
||||
return merge(mergeSort(left), mergeSort(right))
|
||||
}
|
||||
|
||||
/**
|
||||
* 逆序对
|
||||
* @param {number[]} nums
|
||||
* @return {number}
|
||||
*/
|
||||
export const reversePairs = function (nums) {
|
||||
resetCount()
|
||||
mergeSort(nums)
|
||||
return count
|
||||
}
|
Reference in New Issue
Block a user