数组中的逆叙述对
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;
}
};
相关文章推荐
- lua 与 c/c++ 交互(3)c/c++ 调用 lua 数组类型 table
- 二维数组求最大子数组
- 对象、对象数组、JSON、JSON数组的相关操作
- 《剑指offer》构建乘积数组
- Java学习----数组
- PHP数组
- Javascript技巧之不要用for in语句对数组进行遍历
- 数组的反射
- poj 2352 && hdu 1541 Stars (树状数组)
- 数据逆向分析(3)——识别字符串与数组
- 1050 循环数组最大子段和
- 嵌入式开发第5天(数组)
- 获取浏览器cookie,然后已数组形式返回
- 数组与集合的详解
- java基础(4)--流程控制与数组
- 两个一位数组能否排序一个另一个跟着排序?
- 170618 如何利用pandas将numpy数组导出生成excel
- 安卓使用Gson解析服务器返回Json数组,以及java服务器怎样返回list集合的Json数据(原创)
- 深入理解 C++ 指针(五)---数组和指针的关系
- 1.数组--最大值 2.数组--选择排序与图解 3.数组--冒泡排序图解 4.数组--1.自带排序2.遍历功能方便 5.数组-常见操作-排序位置置换代码提取