逆序对

  • 归并思想
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
class Solution {
public:
int reversePairs(vector<int>& nums) {
if (!size(nums)) return 0;
int cnt = 0;
int data[size(nums)];
for (int i = 0; i < nums.size(); ++ i) data[i] = nums[i];

int tmp[size(nums)];
function<void(int, int)> merge = [&](int l, int r) {
if (l == r) return ;
int mid = l + r >> 1;

merge(l, mid), merge(mid + 1, r);
int i = l, j = mid + 1, k = 0;
while (i <= mid && j <= r){
if (data[i] <= data[j]) tmp[k++] = data[i++];
else {
tmp[k++] = data[j++];
// data[j] < data[i]时,说明[i, mid]范围内的数都大于data[j]
cnt += mid + 1 - i;
}
}
while (i <= mid) tmp[k++] = data[i++];
while (j <= r) tmp[k++] = data[j++];
for (int i = l, k = 0; i <= r; ++ i, ++ k) data[i] = tmp[k];

};
merge(0, nums.size()-1);
return cnt;
}
};