(个人水平有限,请见谅!)
题目描述:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
输入:
1,2,3,4,5,6,7,0
输出:
7
代码示例:
暴力破解只能通过50%。
//这段代码的作用是关闭输入输出流的绑定,可以提高代码的运行效率
static const auto io_sync_off = []() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
return nullptr;
}( );
class Solution {
public:
int InversePairs(vector<int> data) {
int length = data.size();
if (length <= 0)
return 0;
vector <int> copy(data.begin(), data.end());
long long count = InversePairsCore(data, copy, 0, length-1);
return count%1000000007;
}
long long InversePairsCore(vector<int>& data, vector<int>& copy, int begin, int end)
{
if (end == begin)
return 0;
int length = (end-begin) / 2;
// 注意此处data与copy互换,是由于copy每次存放新排序数组,跳转后直接把上次排序的数组替换data
long long left = InversePairsCore(copy, data, begin, begin+length);
long long right = InversePairsCore(copy, data, begin+length+1, end);
int i = begin+length, j = end, indexcopy = end;
long long count = 0;
while (i>=begin && j>=begin+length+1)
{
if (data[i] > data[j])
{
copy[indexcopy--] = data[i--];
count += j-begin-length;
}else{
copy[indexcopy--] = data[j--];
}
}
for ( ; i >= begin; i--)
copy[indexcopy--] = data[i];
for ( ; j >= begin+length+1; j--)
copy[indexcopy--] = data[j];
return left+right+count;
}
};