JS/TS算法---分治和排序

function reversePairs(nums: number[]): number {

let count = 0;
// 如果数组中只有1个元素或者为空,则不存在逆序对
if (nums.length < 2) return count;

const mergeSort = (front, behind) => {
// 如果前后指针相遇,则归并区间只剩下一个元素了
if (front == behind) return [nums[front]];

let mid = front + ((behind - front) >> 1);
// 规则让左半部分不包含中心元素 右半部分包含中心元素
let left = mergeSort(front, mid);
let right = mergeSort(mid + 1, behind);


let temp = new Array(behind - front + 1).fill(0);
// 合并有三个指针
let cur = 0,
  l = 0,
  r = 0;


while (l < left.length && r < right.length) {
  // 如果右边元素大于左边元素,将左边元素放到结果数组中
  if (right[r] >= left[l]) temp[cur++] = left[l++];
  else {
    temp[cur++] = right[r++];
    // 如果左边元素大于右边元素,那就出现了序列对了-------**
    // 由于左右两边都是有序的,左边当前元素及之后的元素都会跟右边构建逆序对
    count += left.length - l;
  }
}


while (l < left.length) temp[cur++] = left[l++];
while (r < right.length) temp[cur++] = right[r++];


return temp;

};

// 左闭右闭区间
mergeSort(0, nums.length - 1);

return count;

}

posted @ 2022-08-26 11:30  青川薄  阅读(37)  评论(0编辑  收藏  举报