我曾经参加Facebook的面试,他们问了我这个问题。
假设您有一个具有N个不同值的无序数组
$input = [3,6,2,8,9,4,5]
实现一个函数,找到第K大的值。
例如:如果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);
}
我刚刚测试了一下,根据这个问题,该方法运行良好。然而面试者说,“为了让你的生活更加复杂!假设你的数组包含数百万个数字,那么你的列表变得太慢了。在这种情况下你会怎么做?” 作为提示,他建议使用“最小堆”。就我所知,堆的每个子节点的值都不应超过根节点的值。所以,在这种情况下,如果我们假设3是根节点,那么6是它的子节点,而且其值大于根节点的值。我可能是错的,但你认为呢?基于“最小堆”的思想,该如何实现?
2
而不是3
。一种可能的布局是树2 -> [3,4],3 -> [5,6],4 -> [8,9]
。 - paxdiabloCollections.sort
是否会删除重复项! - Hesam