数组中的逆序对
来源:互联网 发布:蚁群算法 旅行商问题 编辑:程序博客网 时间:2024/06/05 17:04
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
示例1
输入
1,2,3,4,5,6,7,0
输出
7
归并排序的改进,把数据分成前后两个数组(递归分到每个数组仅有一个数据项),
合并数组,合并时,出现前面的数组值array[i]大于后面数组值array[j]时;则前面
数组array[i]~array[mid]都是大于array[j]的,count += j - midclass Solution {private: const int MOD = 1000000007;public: int InversePairs(vector<int> data) { if (data.empty()) return 0; vector<int> copy(data.size()); for (int i = 0; i < data.size(); ++i)//设置一个copy数组用于归并排序 copy[i] = data[i]; return solve(data, copy, 0, data.size() - 1); } int solve (vector<int>& data, vector<int>& copy, int low, int high) { if (low == high) return 0; int mid = (low + high) >> 1; int left = solve(data, copy, low, mid) % MOD;//左半段 int right = solve(data, copy, mid+1, high) % MOD;//右半段 int i = mid, j = high; int loc = high; int cnt = 0; while (i >= low && j > mid) {//合并两段,并排序 if (data[i] > data[j]) { copy[loc--] = data[i--]; cnt = (cnt + j - mid) % MOD; } else { copy[loc--] = data[j--]; } } while (j > mid) {//若右半段还有剩余 copy[loc--] = data[j--]; } while (i >= low) {//若左半段还有剩余 copy[loc--] = data[i--]; } for (int k = low; k <= high; ++k) {//把排好序的数组赋值给data data[k] = copy[k]; } return ((left + right)% MOD + cnt) % MOD; }};
阅读全文
0 0
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- HTML + css 实现表白墙效果页面
- js操作textarea换行显示与拆分
- HDU 1907 John 尼姆博弈
- 数据结构实验之二叉树三:统计叶子数
- CMP caffe新添层解析 openpose caffe 新添层解析
- 数组中的逆序对
- unity API中assert类下的函数作用简介解释
- 结构型-组合模式(composite)
- DBCP连接池原理分析
- 提高Web服务端并发效率的异步编程技术
- 使用Gradle查看Android依赖树图
- Codeforces785C (二分)
- 利用转换器将cad转pdf格式
- android 使用MediaCodec(根据设备状况硬编解码)来转码音频(MP3 to aac),并同时裁剪音频