您的位置:首页 > Web前端

剑指offer—数组中的逆序对

2015-10-05 21:18 531 查看
华电北风吹

天津大学认知计算与应用重点实验室

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