题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
问题分析
//思路1暴力解决
//思路2利用归并排序
参考:https://www.nowcoder.com/questionTerminal/96bd6684e04a44eb80e6a68efc0ec6c5?f=discussion
解题思路1
class Solution {
public:
long countInversePairs(vector<int> &data,vector<int> ©,int start,int end)
{
if (start == end)
{
copy[start] = data[start];
return 0;
}
//
int length = (end-start)/2;
long left = countInversePairs(copy,data,start,start+length);
long right = countInversePairs(copy,data,start+length+1,end);
int i = start+length;
int j = end;
int indexCopy = end;
long count = 0;
while(i >= start && j >= (start+length+1))
{
//逆序对出现
if (data[i] > data[j])
{
copy[indexCopy--] = data[i--];
//统计方式需要分析
count = count + j - start-length;
} else
{
copy[indexCopy--] = data[j--];
}
}
for( ; i >= start; i--)
{
copy[indexCopy--] = data[i];
}
for( ; j >= (start+length+1); j--)
{
copy[indexCopy--] = data[j];
}
return left+right+count ;
}
int InversePairs(vector<int> data) {
if(data.empty())
{
return 0;
}
//copy 一个同样大小的数组
vector<int> copy(data);
long count = countInversePairs(copy,data,0,data.size()-1);
return count%1000000007;
}
};
网友评论