[剑指offer]数组中的逆序对
2016-05-06 13:50
225 查看
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。分析:类似于mergesort的思想,对于两个排序的数组,用两个指针分别指向末尾,比如p,q,如果p的值大于q,那么p与q和q之前所有数字都可以组成逆序对,count就加上后一个数组的长度,再将p指针前移继续比较;如果q的值比较大,那么直接将q前移,因为没有逆序对。每次比较的时候把较大的数字复制进额外申请的数组(mergesort不是原地排序,需要空间换时间)。
代码:
class Solution { public: int InversePairs(vector<int> data) { int n=data.size(); return mergesort(data,0,n-1); } int mergesort(vector<int> &data,int low,int high){ if(low>=high) return 0; int mid=(low+high)/2; int left=mergesort(data,low,mid); int right=mergesort(data,mid+1,high); vector<int> nums(data); int p=mid; int q=high; int count=0; int k=high; while(p>=low&&q>=mid+1){ if(data[p]>data[q]){ nums[k--]=data[p--]; count+=q-mid; }else{ nums[k--]=data[q--]; } } while(p>=low){ nums[k--]=data[p--]; } while(q>=mid+1){ nums[k--]=data[q--]; } for(int i=low;i<=high;i++){ data[i]=nums[i]; } return (left+right+count); } };
ps. 希望老板让我安静地狗带吧。。我真的不想再写论证报告了。。。
相关文章推荐
- JQuery侧边栏实现
- Javascript 面向对象编程(一):封装
- HTML常用标签整理
- jQuery对象和js对象相互转换
- JavaScript中对于闭包的理解
- js 判断是什么类型浏览器
- 《Nodejs开发加密货币》之九:在Nodejs中使用加密解密技术
- javascript之string对象 以及字符串各种用法
- HTML5-Web Workers实现多线程
- 两个很好的angular调试工具-——batarang(stable)和ng-inspector
- 剑指Offer--037-两个链表的第一个公共结点
- 欢迎使用CSDN-markdown编辑器
- Web网页简单的静态导航菜单的制作
- ExtJS自定义控件 之一:datetimefield控件
- html页面中显示审查元素时Element.style
- BootStrap制作导航条实例代码
- JSON解析工具-org.json
- d3.js——圆形分区图
- 自己写一个js表单验证框架(转)
- AngularJS的启动引导过程