51. 【困难】数组中的逆序对.md
文章发布较早,内容可能过时,阅读注意甄别。
# 题目来源:
# 题目
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
示例 1:
输入: [7,5,6,4]
输出: 5
1
2
3
2
3
# 分析
略
# 代码实现
class Solution {
// 求逆序对的个数
public int reversePairs(int[] nums){
int[] temp = new int[nums.length];
return sort(nums, 0, nums.length - 1 , temp);
}
private int sort(int[] arr, int l, int r, int[] temp) {
if (l >= r) return 0;
int mid = l + (r - l) / 2;
int res = 0;
res += sort(arr, l, mid, temp);
res += sort(arr, mid + 1, r, temp);
if (arr[mid] > arr[mid + 1]) {
res += merge(arr, l, mid, r, temp);
}
return res;
}
private int merge(int[] arr, int l, int mid, int r, int[] temp) {
System.arraycopy(arr, l, temp, l, r - l + 1);
int i = l, j = mid + 1;
int res = 0;
for (int k = l; k <= r; k++) {
if (i > mid) {
arr[k] = temp[j++];
} else if (j > r) {
arr[k] = temp[i++];
} else if (temp[i] <= temp[j]) {
arr[k] = temp[i++];
} else {
res += mid - i + 1;
arr[k] = temp[j++];
}
}
return res;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
上次更新: 2024/03/07, 20:33:54