Найти два наибольших элемента массива

За один проход поддерживайте наибольшее и второе наибольшее значения. Повторы учитываются: для [5,5,1] ответ [5,5], поскольку требование различности не задано.

Короткий ответ

Что ответить на собеседовании

За один проход поддерживайте наибольшее и второе наибольшее значения. Повторы учитываются: для [5,5,1] ответ [5,5], поскольку требование различности не задано.

Подробный разбор

Ответ с пояснениями

Условие

Создайте метод, который принимает произвольное количество целых чисел через varargs и возвращает два максимальных значения. Используйте только базовые конструкции языка. Результат должен быть представлен массивом вида [firstMax, secondMax].

private static int[] getTwoMax(int... numbers) {
    // return the maximum two numbers from an array of numbers e.g. [firstMax, secondMax]
}

Ответ

За один проход поддерживайте наибольшее и второе наибольшее значения. Повторы учитываются: для [5,5,1] ответ [5,5], поскольку требование различности не задано.

private static int[] getTwoMax(int... numbers) {
    if (numbers == null || numbers.length < 2) throw new IllegalArgumentException();
    int first = Math.max(numbers[0], numbers[1]);
    int second = Math.min(numbers[0], numbers[1]);
    for (int i = 2; i < numbers.length; i++) {
        int value = numbers[i];
        if (value > first) { second = first; first = value; }
        else if (value > second) second = value;
    }
    return new int[]{first, second};
}

Время O(n), дополнительная память O(1), включая два выходных значения. Инициализация первыми элементами корректна и для отрицательных чисел. Для двух различных максимумов нужен иной контракт и обработка отсутствия второго значения.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее