- 题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
- idea:使用归并排序的思想。假设左右两边都已经排好序了。假如data[j]<data[i],那么i一直到mid的数都比data[j]大,因此包括第j个数的逆序对的数量比mid-i+1。i以前的数比j小必然也比j+1小,因此j+1以后的数不可能跟i以前的数构成逆序对。
- 遇到的坑:data要加引用vector &data。C++不像java那样子传对象进去的时候是传的引用…
- code
static int res = 0;
class Solution {
public:
void helper(vector<int> &data, int low, int high){
if (low>=high) return;
int mid = (low+high)/2;
helper(data, low, mid); helper(data, mid+1, high);
int i = low, j = mid+1;
int *tmp = new int[high-low+1];
int index = 0;
while(i < mid+1 && j < high+1){
if (data[j]<data[i]){
tmp[index++] = data[j++];
res += mid-i+1;
res = res>=1000000007?res%1000000007:res;
}
else{
tmp[index++] = data[i++];
}
}
while(i<mid+1){
tmp[index++] = data[i++];
}
while(j<high+1){
tmp[index++] = data[j++];
}
for (int k = 0; k < high-low+1; k++){
data[low+k] = tmp[k];
}
delete [] tmp;
}
int InversePairs(vector<int> data) {
helper(data, 0, data.size()-1);
return res;
}
};