您的位置:首页 > Web前端

数组中的逆叙述对

2018-03-26 13:40 232 查看


题目描述

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007刚开始我是采用暴力枚举的方式求解,但是由于复杂度太高不能通过;于是尝试的其他人提到归并排序的方法,凑巧的刚刚写了归并排序的算法,就拿来检验一下,果然顺利通过;过程中有一个坑大家需要注意的是,在累计逆序数对的过程中,就需要对计数进行取余操作,不然会越界;具体细节见代码:class Solution {
public:

void merge_sort(vector<int> &vec, int low, int mid, int high, int &counter)
{
vector<int> temp_arr;
int i = low;
int j = mid + 1;
while (i <= mid && j <= high)
{
if (vec[i] <= vec[j])
{
temp_arr.push_back(vec[i]);
i++;
}
else
{
counter += (mid - i + 1);
counter = counter % 1000000007;
temp_arr.push_back(vec[j]);
j++;
}
}

while (i <= mid)
{
temp_arr.push_back(vec[i]);
i++;

}

while (j <= high)
{
temp_arr.push_back(vec[j]);
j++;
}

for (int k = 0; k < temp_arr.size(); k++)
{
vec[low + k] = temp_arr[k];
}
}

void sort(vector<int> &vec, int low, int high, int &counter)
{
if (low >= high)
{
return;
}
int mid = (low + high) / 2;
sort(vec, low, mid, counter);
sort(vec, mid + 1, high, counter);
merge_sort(vec, low, mid, high, counter);
}

int InversePairs(vector<int> data) {
if (data.size() == 0)
{
return 0;
}
int counter = 0;
sort(data, 0, data.size() - 1, counter);
return counter%1000000007;

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息