За один проход поддерживайте наибольшее и второе наибольшее значения. Повторы учитываются: для [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), включая два выходных значения. Инициализация первыми элементами корректна и для отрицательных чисел. Для двух различных максимумов нужен иной контракт и обработка отсутствия второго значения.