Для непустого списка функция корректна и уже имеет оптимальное O(n) время и O(1) память. Проблема контракта — null и пустой список маскируются значением int.MinValue.
Повышение эффективности поиска наибольшего числа в списке
Для непустого списка функция корректна и уже имеет оптимальное O(n) время и O(1) память. Проблема контракта — null и пустой список маскируются значением int.MinValue.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дана функция FindMax, реализующая поиск максимального значения в списке целых чисел. Является ли её реализация корректной? Как её можно улучшить с точки зрения производительности?
private int FindMax(List<int> numbers)
{
int currentMax = int.MinValue;
if (numbers != null)
{
foreach (int value in numbers)
{
if (currentMax < value)
{
currentMax = value;
}
}
}
return currentMax;
}
Ответ
Для непустого списка функция корректна и уже имеет оптимальное O(n) время и O(1) память. Проблема контракта — null и пустой список маскируются значением int.MinValue.
Для неупорядоченного списка в общем случае нужно просмотреть каждый элемент: максимум может оказаться последним. Сортировка даст лишнюю работу O(n log n), а замена foreach на for не улучшит асимптотику.
Лучше отклонять null и пустой список исключением либо возвращать nullable int/TryFindMax. При строгом контракте инициализируйте максимум первым элементом и сравнивайте остальные. Возвращать int.MinValue как признак отсутствия результата неоднозначно: это допустимое значение настоящего максимума.