Храните два максимума, обновляя их при просмотре каждого элемента. Считайте два вхождения максимального числа отдельными кандидатами, если уникальность значений не требуется.
Поиск двух наибольших чисел в массиве
Храните два максимума, обновляя их при просмотре каждого элемента. Считайте два вхождения максимального числа отдельными кандидатами, если уникальность значений не требуется.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо реализовать функцию, которая возвращает два самых больших значения из переданного массива целых чисел.
private static int[] getTwoMax(int[] arr) {
// return the maximum two numbers from an array of numbers, e.g. [firstMax, secondMax]
return new int[0];
}
Ответ
Храните два максимума, обновляя их при просмотре каждого элемента. Считайте два вхождения максимального числа отдельными кандидатами, если уникальность значений не требуется.
private static int[] getTwoMax(int[] arr) {
if (arr == null || arr.length < 2) throw new IllegalArgumentException();
int largest = Math.max(arr[0], arr[1]);
int next = Math.min(arr[0], arr[1]);
for (int i = 2; i < arr.length; i++) {
if (arr[i] > largest) { next = largest; largest = arr[i]; }
else if (arr[i] > next) next = arr[i];
}
return new int[]{largest, next};
}
Результат упорядочен по убыванию. Время O(n), память O(1), исходник не меняется. Вариант работает с Integer.MIN_VALUE без специальных sentinel-значений. Если нужны различные максимумы, это следует уточнить до реализации.