CodingInterview-数组中的逆序对

思路参考归并排序,在归并排序的同时统计逆序对。

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
class Solution {
private:
long reverseNum;
vector<int>* data;
vector<int>* tdata;
public:
int InversePairs(vector<int> data) {
if(data.size()<=1) return 0;
this->data=&data;
reverseNum=0;
tdata=new vector<int>(data.size());
findInversePair(0,data.size()-1);
return (int)(reverseNum%1000000007);
}
void findInversePair(int left,int right){
if(left==right) return;
int mid=(right+left)/2;
findInversePair(left,mid);
findInversePair(mid+1,right);
for(int i=left;i<=right;i++) (*tdata)[i]=(*data)[i];
int pLeft=mid;
int pRight=right;
int pData=right;
while(pLeft>=left && pRight>=mid+1){
if((*tdata)[pLeft]>(*tdata)[pRight]){
reverseNum+=pRight-mid;
(*data)[pData]=(*tdata)[pLeft--];
}else{
(*data)[pData]=(*tdata)[pRight--];
}
pData--;
}
while(pLeft>=left) (*data)[pData--]=(*tdata)[pLeft--];
while(pRight>=mid+1) (*data)[pData--]=(*tdata)[pRight--];
}
};

其实统计的难度不是很大,关键是在于归并排序的算法。虽然我的思路基本是对的,但是结束条件写的有些问题,所以调试了很久,so sad。