[剑指OFFER] 数组中的逆序对
2015-07-15 13:52
417 查看
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。分析:利用归并排序的思想,分成2部分,每一部分按照从大到小排序,然后比较左侧的a[i]和右侧的b[j]
若a[i]>b[j],那么a[j]大于b[j]~b[right], 产生 right-j+1 组逆序对。
若a[j]<=b[j],不产生逆序对。
同时更新数组的从left到right部分,实现其从大到小排序,然后在拿排序号的数组和更大的数组进行排序,同时计算逆序组的数量。
class Solution { private: int merge(vector<int>& data, int left, int mid, int right) { vector<int> tmpVec; int cnt = 0; int i = left, j = mid + 1; // sort vecotr from big to small while(i <= mid && j <= right) { if(data[i] > data[j]) { cnt += (right - j + 1); tmpVec.push_back(data[i]); i++; } else { tmpVec.push_back(data[j]); j++; } } while(i <= mid) { tmpVec.push_back(data[i]); i++; } while(j <= right) { tmpVec.push_back(data[j]); j++; } //copy tmp data to original data for(int k = 0; k <= (right - left); k++) { data[k + left] = tmpVec[k]; } return cnt; } int inversePairs(vector<int>& data, int left, int right) { if(data.size() == 0) return 0; if(left >= right) return 0; int mid = (left + right)/2; int cnt = 0; cnt += inversePairs(data, left, mid); cnt += inversePairs(data, mid + 1, right); cnt += merge(data, left, mid, right); return cnt; } public: int InversePairs(vector<int> data) { return inversePairs(data, 0, data.size() - 1); } };
相关文章推荐
- json.dumps loads 终于区分出来了
- MAC终端:如何调整字体大小和终端样式
- html文档模式
- jQuery插件
- 前端开发相关---个人收藏网址地址大全
- 页面自动刷新
- [LeetCode] Delete Node in a Linked List
- java中fail-fast 和 fail-safe的区别
- md5 jsp页面,加密用
- jsp内置对象 的使用范围和类型【说明】
- JavaScript高级程序设计【面向对象-创建对象】
- 页面自动执行(加载)js的几种方法
- html日期控件
- HTML4和HTML5之间10主要差异
- JQuery基础选择器
- js的二维数组
- leetcode[237]:Delete Node in a Linked List
- Java 开发者如何入门 Node.js 英文原文:Getting Started with Node.js for the Java Developer
- jQuery图表插件Flot中文文档
- 基于NodeJS的全栈式开发(基于NodeJS的前后端分离)