【Sorting】【Array】Find reverse pair in an/two array(s)
数组中的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
输入:
每个测试案例包括两行:
第一行包含一个整数n,表示数组中的元素个数。其中1 <= n <= 10^5。
第二行包含n个整数,每个数组均为int类型。
输出:
对应每个测试案例,输出一个整数,表示数组中的逆序对的总数。
样例输入:
4
7 5 6 4
样例输出:
5
思路
分治的思想,统计两边内部的逆序对,以及左右两边之间的逆序对
代码
long long merge2part(vector<int>& nums, int start, int mid, int end){
vector<int> tmp;
int p = start;
int q = mid+1;
long long npair = 0;//long long能过大数据
while(p <= mid && q <= end){
if(nums[p]<=nums[q]){
tmp.push_back(nums[p++]);
} else{
tmp.push_back(nums[q++]);
npair += mid - p + 1;//核心
}
}
while(p <= mid){
tmp.push_back(nums[p++]);
}
while(q <= end){
tmp.push_back(nums[q++]);
}
/*
for(int n : tmp){
nums[i++] = n;
}
*/
int i = start;
for (vector<int>::iterator it = tmp.begin() ; it != tmp.end(); ++it){
nums[i++] = *it;
}
return npair;
}
long long reversePair(vector<int>& nums, int start, int end){
if(start >= end) return 0;
int mid = (start + end) /2;
long long npair = 0; //根据提供的数据量,估算npair会超出int的范围
npair += reversePair(nums, start, mid); //mid应该归前半段(23|45)
npair += reversePair(nums, mid+1, end);
npair += merge2part(nums, start, mid, end);
return npair;
}
int main() {
int a, b;
vector<int> nums;
while(cin >> a){
nums.clear();//别忘了清零
while (a-- > 0 && cin >> b){
nums.push_back(b);
}
cout << reversePair(nums, 0, nums.size()-1) << endl;
}
return 0;
}
/**************************************************************
Problem: 1348
Language: C++
Result: Accepted
Time:240 ms
Memory:3064 kb
****************************************************************/
Find reverse pair in two arrays
There are two arrays A1 and A2. Find out the pairs of numbers in A2 which were in reverse order in A1.
For ex.
A1 = 2 6 5 8 1 3
A2 = 1 2 3 4 5 6
Answer: 1 & 2 5 & 6
思路
- 对第二个数组作value, index的hash,复杂度受限于输出的规模O(n^2),比如两个数组,数字都一样,一个升序一个降序, 所有的pair都打出来也要O(n^2)
- 可以先得到第一个数组里元素的rank list,做成hashset,然后遍历一遍第二个数组,按顺序把出现的第一个数组的元素的rank记录下来:
int *rank_b = new int[len];
int index = 0;
for(int i = 0; i < len; i++){
if(rank_a[b[i]]){
rank_b[index++] = rank_a[b[i]];
}
}
接下来对这个数组做归并排序(类似找逆序数的算法),即可得到所有reversed pairs.
如果只是得到所有reversed pairs的数量的话,O(n*logn)就可以了,如果需要得到所有的pairs,算上拷贝的时间,是O(n^2).
浙公网安备 33010602011771号