您的位置:首页 > 职场人生

面试题40:数组中的逆序对

2016-01-04 08:56 405 查看
题目:

在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中逆序对的总数。

边界条件及异常:

数组为空,或只有一个元素

思路:

根据归并排序来做

时间复杂度: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: