问题:给定:整数列表(允许重复);和整数N.从列表中删除重复项,找到修改后的列表中的第N个最大元素。实现至少两种不同的解决方案,以Big-O表示法找到具有O(N * log(N))平均时间复杂度的第N个最大元素,其中N是列表中元素的数量。
根据我的理解,我可以在提供的带有重复项的整数列表上使用合并排序,堆排序,快速排序,以找到Big-O中具有O(N * log(N))平均时间复杂度的第N个最大元素符号。那是对的吗 ?
另外,如果列表中的重复内容我只是在上面提到的算法中添加额外的代码行来删除不会影响O(N * log(N))平均时间复杂度的重复项,因为Merge Sort,Heap排序,快速排序只会对列表进行排序而不删除重复项。
我不是在寻找任何代码,只是关于如何处理问题的提示和想法?我正在使用Java也有java中的任何预定义的分类/方法,我可以用它来完成任务,而不是我自己编写合并排序,堆排序,快速排序。
我的目标是完成任务,记住O(N * log(N))的平均时间复杂度。
答案 0 :(得分:0)
首先对列表进行排序,然后在其上删除文字以查找所有重复项。第二种方法可能是遍历所有元素并保留一个树结构,其中对于每个元素,首先检查它是否已经存在于树结构O(log(n))中,如果是删除它,则将其添加到树结构中O(日志(N))。这使得整个算法O(n(log(n)))。
答案 1 :(得分:0)
由于您将java添加为标记:
List<Integer> listWithoutDuplicates = new ArrayList(new TreeSet(originalList));
这将构造一个没有重复的新的排序列表。关于时间复杂度,这加起来为O(n * log n)(构造具有n个元素的二元平衡树的复杂性)。作为奖励,你可以尝试用LinkedHashSet替换TreeSet以保留元素的顺序(在重复之间,我认为保留最后一个)。
关于最后一部分,之后通过索引删除元素是直接的。
当然,如果是家庭作业问题,您可能需要实施自己的红黑树才能获得相同的结果。