剑指offer—数组中的逆序对
2015-10-05 21:18
531 查看
华电北风吹
天津大学认知计算与应用重点实验室
日期:2015/10/5
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
解析:刚开始做的时候用的最笨的方法,暴力求解。实际上这个是跟归并排序的思路。动态规划实现。
暴力:
基于归并排序思路:
天津大学认知计算与应用重点实验室
日期:2015/10/5
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
解析:刚开始做的时候用的最笨的方法,暴力求解。实际上这个是跟归并排序的思路。动态规划实现。
暴力:
class Solution { public: int InversePairs(vector<int> data) { int count=0,n=data.size(); for(int i=0;i<n-1;i++) { for(int j=i+1;j<n;j++) { if(data[j]<data[i]) count++; } } return count; } };
基于归并排序思路:
class Solution { public: int InversePairs(vector<int> data) { int length = data.size(); return mergeSort(data, 0, length - 1); } int mergeSort(vector<int>& data, int start, int end) { if (start >= end) return 0; int mid = (start + end) / 2; int leftCounts = mergeSort(data, start, mid); int rightCounts = mergeSort(data, mid + 1, end); vector<int> copy(data); int foreIdx = mid; int backIdx = end; int counts = 0; int idxCopy = end; while (foreIdx >= start && backIdx >= mid + 1) { if (data[foreIdx] > data[backIdx]) { copy[idxCopy--] = data[foreIdx--]; counts += backIdx - mid; } else { copy[idxCopy--] = data[backIdx--]; } } while (foreIdx >= start) { copy[idxCopy--] = data[foreIdx--]; } while (backIdx >= mid + 1) { copy[idxCopy--] = data[backIdx--]; } for (int i = start; i <= end; i++) { data[i] = copy[i]; } return (leftCounts + rightCounts + counts); } };
相关文章推荐
- 我的SBJson来生成和解析JSON串的代码
- React Native系列之-环境安装
- 剑指offer—第一个只出现一次的字符位置
- jsp跳转后台代码页的简易方式~
- CSS3弹性盒模型
- Binary Indexed Tree(BIT) OR Fenwick Tree
- React Native系列之-简介
- 调试CRM JS开发
- jsoup 生僻字乱码问题解决
- jsoup 生僻字乱码问题解决
- 数据库启动核心bootstrap$表
- EffectiveC#2--为你的常量选择readonly而不是const
- HTML5移动Web开发(五)——移动设计之CSS媒介查询
- HTML5移动Web开发(四)——移动设计
- EffectiveC#1--尽可能的使用属性(property),而不是数据成员(field)
- js中style.display=""无效的解决方法
- JavaScript闭包
- 开发人员常用的10个JavaScript库
- Javascript的异常处理介绍
- JS模拟点击的那些事儿