使用归并排序 可以直接比较两个数
function reversePairs(nums: number[]): number {
if (!nums.length) return 0;
let ans = 0;
let left = 0;
let right = nums.length - 1;
mergeSort(left, right);
/**
* 归并排序
* @param left 左边的索引
* @param right 右边的索引
* @returns 返回左边的索引
*/
function mergeSort(left: number, right: number) {
if (left >= right) return;
let mid = left + ((right - left) >> 1);
mergeSort(left, mid);
mergeSort(mid + 1, right);
merge(left, mid, right);
}
/**
* 合并两个数组
* @param left 左边的索引
* @param mid 中间的索引
* @param right 右边的索引
* */
function merge(left: number, mid: number, right: number) {
let temp: number[] = [];
let index = 0;
let i = left;
let j = mid + 1;
while (i <= mid && j <= right) {
if (nums[i] > 2 * nums[j]) {
ans += mid - i + 1;
j++;
} else {
i++;
}
}
i = left;
j = mid + 1;
// 合并两个数组
while (i <= mid && j <= right) {
if (nums[i] <= nums[j]) {
temp[index++] = nums[i++];
} else {
temp[index++] = nums[j++];
}
}
// 将剩余的数组拷贝到temp中 这两个只能最后走一个
while (i <= mid) {
temp[index++] = nums[i++];
}
// 将temp中的数据拷贝到nums中 这两个只能最后走一个
while (j <= right) {
if (nums[i] >= 2 * nums[j]) {
console.log(11)
}
temp[index++] = nums[j++];
}
// 将temp中的数据拷贝到nums中
for (let k = 0; k < temp.length; k++) {
nums[left + k] = temp[k];
}
}
return ans;
};