0
点赞
收藏
分享

微信扫一扫

LeetCode(剑指 Offer)- 51. 数组中的逆序对

题目链接:​​点击打开链接​​

题目大意:

解题思路

如下图所示,为数组 [7, 3, 2, 6, 0, 1, 5, 4][7,3,2,6,0,1,5,4] 的归并排序与逆序对统计过程。

LeetCode(剑指 Offer)- 51. 数组中的逆序对_力扣 算法 解题

结论:逆序对的总数就是归并排序的比较的次数累计和

代码中加了 TODO 的是应对题目,去了的话,就是正儿八经的归并排序,推荐先理解归并排序的代码框架,再看注释~

相关企业

  • 字节跳动
  • 华为
  • 腾讯

AC 代码

class Solution {

int[] arr, tmp;

int res = 0;

public int reversePairs(int[] nums) {
arr = nums;
tmp = new int[nums.length];
mergeSort(0, nums.length - 1);
return res;
}

private void mergeSort(int l, int r) {
if (l >= r) {
return;
}
int m = (l + r)/2;
mergeSort(l, m);
mergeSort(m + 1, r);
mergeArr(l, m, r);
}

private void mergeArr(int l, int m, int r) {
int k = 0, i = l, j = m + 1;
int cnt = 0; // TODO
while (i <= m && j <= r) {
if (arr[i] <= arr[j]) {
tmp[k++] = arr[i++];
cnt++; // TODO
} else {
tmp[k++] = arr[j++];
res += m - l + 1 - cnt; // TODO: 左组数据总数 - 已经放入数组的个人 == 剩下的个数, 也就是左边比右边大的数据个数
}
}

while (i <= m) tmp[k++] = arr[i++];
while (j <= r) tmp[k++] = arr[j++];

for (i = 0; i < k; i++) arr[l + i] = tmp[i];
}
}

举报

相关推荐

0 条评论