【发布时间】:2015-11-26 05:50:53
【问题描述】:
我接受了 Facebook 的采访,他们问了我这个问题。
假设你有一个具有 N 个不同值的无序数组
$输入 = [3,6,2,8,9,4,5]
实现一个查找第 K 个最大值的函数。
EG:如果 K = 0,则返回 9。如果 K = 1,则返回 8。
我做的就是这个方法。
private static int getMax(Integer[] input, int k)
{
List<Integer> list = Arrays.asList(input);
Set<Integer> set = new TreeSet<Integer>(list);
list = new ArrayList<Integer>(set);
int value = (list.size() - 1) - k;
return list.get(value);
}
我刚刚测试过,该方法根据问题运行良好。然而,受访者表示,in order to make your life complex! lets assume that your array contains millions of numbers then your listing becomes too slow. What you do in this case?
作为提示,他建议使用min heap。根据我的知识,堆的每个子值不应超过根值。因此,在这种情况下,如果我们假设 3 是根,那么 6 是它的子节点,并且它的值大于根的值。我可能错了,但是您的想法以及基于min heap 的实现是什么?
【问题讨论】:
-
你为什么不向面试官索要代码示例?
-
在最小堆中,每个节点都小于或等于它的两个子节点。因此,根将是
2而不是3。一种可能的布局是树2 -> [3,4], 3 -> [5,6], 4 -> [8,9]。 -
为什么要转换成 TreeSet 并返回,而不仅仅是调用 Collections.sort?
-
@immibis 哦,是的,我不熟悉 :( 我想从列表中删除所有重复项并按升序对其进行排序。我不确定
Collections.sort是否删除了重复项!
标签: java arrays algorithm min-heap