经典算法——数组中的逆序对
来源:互联网 发布:js开发日历时间控件 编辑:程序博客网 时间:2024/06/06 02:20
一、题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
二、解题方法
利用归并排序的思想,先把数组分隔成子数组,先统计出子数组内部的逆序对的数目,然后再统计出两个相邻子数组之间的逆序对的数目。注意在合并两个已排序的子数组后,要更新数组。
class Solution {public: int InversePairs(vector<int> data) { int n=data.size(); return process(data,0,n-1); } int process(vector<int>& data,int start,int end) { //递归终止条件 if(start>=end) { return 0; } // 归并排序,并计算本次逆序对数 vector<int> copy(data); // 数组副本,用于归并排序 int mid=(start+end)/2; int left=process(data,start,mid); int right=process(data,mid+1,end); int p=mid;//p初始化为前半段最后一个数字的下标 int q=end;//q初始化为后半段最后一个数字的下标 int index=end;//辅助数组的下标初始化为最后一位 int count=0;//记录逆序对的个数 while(p>=start && q>=mid+1) { if(data[p]>data[q]) { copy[index--]=data[p--]; count+=q-mid; } else { copy[index--]=data[q--]; } } while(p>=start) copy[index--]=data[p--]; while(q>=mid+1) copy[index--]=data[q--]; for (int i = start; i <= end; i++) {data[i] = copy[i];//更新归并排序后的子数组 } return (left+right+count); }};
1 0
- 经典算法——数组中的逆序对
- 剑指offer—数组中的逆序对
- 剑指offer—数组中的逆序对
- 【算法】数组中的逆序对的总数
- 算法题目---数组中的逆序对
- 积跬步至千里——算法强化训练(1)统计数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- 数组中的逆序对
- Android 设置EditText光标颜色及粗细
- STL源码剖析——迭代器
- 再谈互斥锁与条件变量!(终于搞清楚了啊!!!!!)
- 49、微信-发现Fragment_Discover
- JavaScript中的匿名函数及函数的闭包
- 经典算法——数组中的逆序对
- C++虚继承(一) --- vtordisp字段
- 欢迎使用CSDN-markdown编辑器
- (转)Android 三星手机拍照,从图库选择照片旋转问题完美解决
- 横竖屏切换时,简单解决webview重新载入问题
- IOS 线程
- 50、微信-朋友圈AlbumActivity
- IOS性能调优系列:使用Instruments动态分析内存泄漏,调优instruments
- 自定义注解