面试题40:数组中的逆序对
2016-01-04 08:56
405 查看
题目:
在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中逆序对的总数。
边界条件及异常:
数组为空,或只有一个元素
思路:
根据归并排序来做
时间复杂度:O(nlgn)
空间复杂度:O(n)
在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中逆序对的总数。
边界条件及异常:
数组为空,或只有一个元素
思路:
根据归并排序来做
时间复杂度:O(nlgn)
空间复杂度:O(n)
#include <iostream> #include <vector> #include <queue> #include <string> #include <stack> #include <algorithm> #include <hash_set> //for hashtable #include <hash_map> #include <unordered_map> #include <set> #include <ctime> using namespace std; int MergeAndCount(vector<int>nums,vector<int> ©, int start, int end) { if (start == end) return 0; int length = (end - start) / 2; int left = MergeAndCount(nums, copy, start, start + length); int right = MergeAndCount(nums, copy, start + length + 1, end); int i = start + length; //初始化为前半段最后一个数字的下标 int j = end; int indexInCopy = end; int count = 0; while (i >= start&&j >= start + length + 1) { if (nums[i] > nums[j]) { copy[indexInCopy--] = nums[i--]; count += j - start - length; } else copy[indexInCopy--] = nums[j--]; } //for (; i >= start; --i) copy[indexInCopy--] = nums[i]; //for (; j >= start + length + 1; --j) copy[indexInCopy--] = nums[j]; return left + right + count; } int InversePairs(vector<int> nums) { int size = nums.size(); if (size < 2) return 0; vector<int> copy(nums); //对副本进行排序 int count = MergeAndCount(nums,copy, 0, size - 1); return count; } int main() { int arr[] = { 7, 6, 4, 5 }; vector<int> nums(arr, arr + 4); cout << InversePairs(nums) << endl; return 0; }
相关文章推荐
- 盘点程序员可以在上面捡钱的共享经济产品
- 黑马程序员——常用的API之冷门兵器
- Java面试题集(51-70)
- Java面试题集(1-50)
- 2015年,程序员年终总结
- 程序员应该做开源项目的 6 个原因
- 程序员遇到BUG后,最好的方法是?
- 2016职业思考路漫漫其修远兮
- 程序员之路--回顾2015,展望2016
- (二)黑马程序员——面向对象
- [漫画]程序员的日常生活 51
- [漫画]程序员的日常生活 50
- [漫画]程序员的日常生活 49
- [漫画]程序员的日常生活 48
- [漫画]程序员的日常生活 47
- [漫画]程序员的日常生活 46
- 据说年薪30万的Android程序员必须知道的帖子
- Java 常用排序算法/程序员必须掌握的 8大排序算法
- 【剑指offer】3.4代码的鲁棒性——面试题15:链表中倒数第k个结点
- 【剑指offer】3.4代码的鲁棒性——面试题17:合并两个排序的链表