У меня было интервью с Facebook, и они задали мне этот вопрос.
Предположим, что у вас есть неупорядоченный массив с N различными значениями
$input = [3,6,2,8,9,4,5]
Реализовать функцию, которая находит наибольшее значение Kth.
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 является его дочерним, а его значение больше, чем значение root. Возможно, я ошибаюсь, но что вы думаете и какова его реализация на основе min heap
?