数组中的逆序对
来源:互联网 发布:番号搜索观看软件 编辑:程序博客网 时间:2024/06/05 08:46
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
算法:
可以使用归并排序的思路,将时间复杂度从
具体思路:
大的在前边的数字对称为逆序对,在归并排序的过程中,如果前边数组的数大于后边数组的数,则就是逆序对。将逆序对个数累加,并组成新的合并降序数组,继续递归归并排序。
class Solution {public: long countRes ; int InversePairs(vector<int> data) { countRes = 0; if(data.size() == 0) return 0; MergeSort(data,0,data.size()-1); return countRes%1000000007 ; } //归并降序排序 void MergeSort(vector<int>& data,int first,int end){ if(first < end){ int mid = (first + end)/2; MergeSort(data,first,mid); MergeSort(data,mid+1,end); vector<int> tmp; MergeArray(data,first,mid,end,tmp); } } void MergeArray(vector<int>& data,int first,int mid,int end,vector<int> tmp){ int i = first;int m = mid; int j = mid + 1;int n = end; while(i<=m && j<=n){ if(data[i] > data[j]){ tmp.push_back(data[i++]); //如果前边数组的数大于后边数组的数,那么就是逆序对。 //因为后边数组也是将序排列的,需要加上后边的所有数字,都能组成逆序对。 countRes += n - j + 1; } else{ tmp.push_back(data[j++]); } } while(i<=m) tmp.push_back(data[i++]); while (j<=n) tmp.push_back(data[j++]); //更新data数组 int k = 0; for (int i = first; i <= end &&k<tmp.size(); i++) data[i] = tmp[k++]; }};
0 0
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- Maven:mirror和repository 区别
- [Tjoi2016&Heoi2016]树
- XZ_iOS之购物车—点击右上角“编辑”按钮,改变所有cell的状态
- 【项目管理和构建】——Maven下载、安装和配置(二)
- 利用多个panel重叠来代替tabcontrol方法
- 数组中的逆序对
- 易语言 运行命令之修改文件属性
- F5负载均衡的初识和基本配置
- Android之解决全屏切换非全屏的页面压缩问题
- java 获取数据库所有表结构
- 【项目管理和构建】十分钟教程,eclipse配置maven + 创建maven项目(三)
- java基础六:数组
- 观察者模式(Observer Pattern)
- jquery动态加载javascript文件的方法