您将获得2010年奥运会门票的数量A.该数组在请求时被排序,因此A(1)是第一个到达而A(2)是第二个到达等。每个请求包含一个十位数的电话号码。为了公平起见,奥运会组织者规定每个电话号码只能有一个请求。已经注意到,阵列A包含来自某些电话号码的多个请求。写一个O(nlogn)时间除法和征服算法,从A中删除来自同一电话号码的所有请求,除了第一次收到的请求。最终输出应该是包含来自唯一电话号码的m <= n个请求的阵列A.此外,A中的请求应保持与删除重复项之前的顺序相同。
如果数组按电话号码排序,我知道如何做到这一点但是我不知道当数组按请求时间排序时是如何实现的。
答案 0 :(得分:7)
合并排序的简单修改就可以了。合并排序为O(n log n)。它也很稳定,这意味着具有相同键的项目将保持相同的相对顺序。这里唯一的区别是你想要消除重复。对代码的唯一更改是比较和复制项目。例如,标准合并排序的内部循环如下所示:
while (leftIndex < leftMax && rightIndex < rightMax)
{
if (a[leftIndex] <= a[rightIndex])
{
output[outputIndex] = a[leftIndex];
++leftIndex;
}
else
{
output[outputIndex] = a[rightIndex];
++rightIndex;
}
}
您可以修改代码,这样就不会复制相同的项目:
while (leftIndex < leftMax && rightIndex < rightMax)
{
if (a[leftIndex] < a[rightIndex])
{
output[outputIndex] = a[leftIndex];
++leftIndex;
}
else if (a[leftIndex] > a[rightIndex])
{
output[outputIndex] = a[rightIndex];
++rightIndex;
}
else
{
// items are equal.
// increment the right, but don't copy anything
++rightIndex;
}
}
您也可以使用标准合并排序执行此操作,然后对已排序的数组执行最终传递以删除重复项。
您可以将Quicksort与自定义比较功能结合使用,以比较电话号码和日期/时间。然后对排序的数组进行最后一次传递以删除重复项。
Quicksort和Mergesort都被认为是分而治之的算法。