C++求多组逆序对的数量
时间: 2024-09-29 08:00:40 浏览: 31
在C++中,计算多组逆序对的数量通常涉及在线性时间复杂度下解决这个问题,例如使用哈希表或者排序数组。一种常见的方法是使用“二分查找”结合哈希统计。这里是一个简化版的步骤:
1. 首先,遍历整个序列,对于每个元素,记录其索引和值,并插入到哈希表或有序数组中。
2. 再次遍历给定的第二个序列。对于每个元素,从第一个序列中找到它应该大于等于的所有元素(即大于等于它的最小已知元素)。此时,由于数组已经排序,可以在O(logn)的时间内完成这个查找。
3. 记录每个查找操作,因为这代表了一对逆序对,其中第一部分是当前元素,第二部分是哈希表中找到的元素。如果找到的元素大于当前元素,则这个操作就是一个逆序对。
4. 最终,遍历结束后,哈希表中剩下的元素就是第一个序列中小于等于对应位置元素的那些,它们也将形成逆序对,所以还需要加上这部分。
```cpp
#include <unordered_map>
using namespace std;
int countInversions(vector<int>& arr1, vector<int>& arr2) {
unordered_map<int, int> map;
for (int i = 0; i < arr1.size(); i++) {
map[arr1[i]] = i;
}
int inversions = 0;
for (int num : arr2) {
if (map.count(num)) {
inversions += map[num];
}
inversions++;
}
// Account for the remaining elements in arr1 that are less than or equal to their position
for (auto& pair : map) {
inversions += pair.second - pair.first + 1;
}
return inversions;
}
```
阅读全文