归并排序应用——逆序对
来源:互联网 发布:etet55最新域名 编辑:程序博客网 时间:2024/06/15 01:34
题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007(来源于剑指offer)
题目解析:正常做法逐个扫描时间复杂度O(n^2)肯定不行。就要找规律,这道题目是关于逆序对的,那么排序好的就不需要统计,当所有的数都排序好后(增序)这道题目也就完成了。所以这是一道排序的题目。可以降低时间复杂度,并且相互之间有序的排序算法就是归并排序。
class Solution {public: int InversePairs(vector<int> data) { if(data.size()<2) return 0; vector<int> copy(data.size()); int sum = 0; InversePairCore(data, copy, sum, 0, data.size()-1); return sum%1000000007; } void InversePairCore(vector<int> &data, vector<int>& copy, int &sum, int s, int e) { if(s<e) { int mid = (s+e)/2; InversePairCore(data, copy, sum, s, mid); InversePairCore(data, copy, sum, mid+1, e); //排序 统计 int i=mid, j=e, k=e; while(i>=s && j>=mid+1) { if(data[i]>data[j]) { sum = (sum + (j-mid))%1000000007; copy[k--] = data[i--]; } else { copy[k--] = data[j--]; } } while(i>=s) copy[k--] = data[i--]; while(j>=mid+1) copy[k--] = data[j--]; for(i=s; i<=e; i++) { data[i] = copy[i]; } } }};
阅读全文
0 0
- 归并排序应用——逆序对
- 应用归并排序解决——求逆序对问题
- 逆序对/归并排序的应用
- 归并排序应用——数组中的逆序对 and 计算数组的小和
- 数组中的逆序对——分治法(归并排序的应用)
- 逆序对 归并排序
- 归并排序 & 逆序对
- 归并排序--逆序对
- 归并排序&归并排序求逆序对
- 归并排序思想应用之----求数组中的逆序对
- 归并排序求逆序对
- 【归并排序】【逆序对】序列
- 归并排序与逆序对
- 归并排序求逆序对
- 归并排序求逆序对~~~
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 形式参数和实际参数
- 怎么给视频加密、选用隐大师U盘
- 20170911心情总结
- 论文
- JAVA判断字符串编码
- 归并排序应用——逆序对
- 线段树的构造-LintCode
- LightOJ-1370 Bi-shoe and Phi-shoe
- 汪砚军塞外亮剑扬威
- 88. Merge Sorted Array
- PL/SQL保存桌面
- Haproxy
- halcon投影
- springboot修改端口