Skip to main content

Як знайти максимальний елемент масиву?

Коротка відповідь

Максимальний елемент невідсортованого масиву знаходиться за O(n). Для невеликих масивів зручно Math.max(...arr); для надійності й великих масивів - звичайний цикл.

javascript
function max(arr) { if (arr.length === 0) return undefined; // або кинути помилку let m = arr[0]; for (let i = 1; i < arr.length; i++) { if (arr[i] > m) m = arr[i]; } return m; } // Приклад console.log(max([3, 10, -5])); // 10

Детальна відповідь

Варіанти рішення

  • Math.max зі spread (просто і наочно, підходить для невеликих масивів):

    javascript
    const arr = [3, 10, -5]; const max1 = Math.max(...arr); // 10 // Важливо: Math.max(...[]) === -Infinity; для порожніх масивів потрібна окрема умова. // Для дуже великих масивів spread може викликати помилку "Too many arguments".
  • reduce (лаконічно, але враховуйте порожній масив):

    javascript
    const arr = [3, 10, -5]; const max2 = arr.reduce((m, x) => (x > m ? x : m), -Infinity); // 10 // Для порожнього масиву поверне -Infinity, перевірте окремо, якщо це неприйнятно.
  • Звичайний цикл (найнадійніший і найшвидший для великих масивів):

    javascript
    function maxLoop(arr) { if (arr.length === 0) return undefined; let m = arr[0]; for (let i = 1; i < arr.length; i++) { if (arr[i] > m) m = arr[i]; } return m; } console.log(maxLoop([3, 10, -5])); // 10

Надійна реалізація з перевірками

Суворий варіант: лише числа, NaN заборонено. Кидає помилку при некоректних даних.

javascript
function maxNumberStrict(arr) { if (!Array.isArray(arr)) throw new TypeError('Expected an array'); if (arr.length === 0) return undefined; // або throw let m; for (let i = 0; i < arr.length; i++) { const v = arr[i]; if (typeof v !== 'number' || Number.isNaN(v)) { throw new TypeError('Array must contain only valid numbers'); } if (m === undefined || v > m) m = v; } return m; } console.log(maxNumberStrict([4, 1, 9, 2])); // 9

Толерантний варіант: намагається привести значення до числа, пропускаючи нечислові/нескінченні. Зручно для «брудних» даних.

javascript
function maxNumberSafe(arr) { let m = -Infinity; for (const v of arr) { const num = Number(v); if (!Number.isFinite(num)) continue; // пропускаємо NaN/Infinity/нечислове if (num > m) m = num; } return m === -Infinity ? undefined : m; } console.log(maxNumberSafe(["7", 3, null, 12, NaN])); // 12 console.log(maxNumberSafe([])); // undefined

Масив об'єктів (max за полем)

javascript
function maxBy(arr, selector) { if (arr.length === 0) return undefined; let best = arr[0]; let bestKey = selector(best); for (let i = 1; i < arr.length; i++) { const key = selector(arr[i]); if (key > bestKey) { best = arr[i]; bestKey = key; } } return best; } const users = [ { name: 'A', age: 19 }, { name: 'B', age: 27 }, { name: 'C', age: 23 }, ]; const oldest = maxBy(users, u => u.age); console.log(oldest); // { name: 'B', age: 27 }

Складність, сортування й великі масиви

  • Складність: O(n) за часом і O(1) за пам'яттю (для циклу/reduce).

  • Не сортуйте масив лише заради максимуму: сортування - O(n log n), це гірше, ніж один прохід.

  • Уникайте Math.max(...arr) для дуже великих масивів: можлива помилка через ліміт кількості аргументів. Використовуйте цикл.

  • TypedArray (Float64Array тощо) перебирайте циклом, це ефективно й безпечно.

  • BigInt: Math.max не працює з BigInt. Використовуйте цикл порівняння BigInt:

    javascript
    function maxBigInt(arr) { if (arr.length === 0) return undefined; let m = arr[0]; // припускаємо BigInt for (let i = 1; i < arr.length; i++) if (arr[i] > m) m = arr[i]; return m; } console.log(maxBigInt([1n, 5n, 3n])); // 5n

Граничні випадки й коректність

  1. Порожній масив: поверніть undefined або киньте помилку; Math.max(...[]) дає -Infinity - зазвичай це не те, що потрібно.
  2. NaN/Infinity: вирішіть політику заздалегідь: ігнорувати, кидати помилку чи повертати NaN. Будьте послідовні.
  3. Змішані типи: приведення до числа може дати NaN; у «суворій» версії краще валідувати типи.
  4. Уже відсортований масив: максимум - останній елемент, але якщо масив не гарантовано відсортований, все одно потрібен прохід O(n).

Короткі рекомендації

  • Невеликі масиви: Math.max(...arr) з перевіркою на порожній масив.
  • Великі масиви або продуктивність: класичний цикл.
  • «Брудні» дані: версія з пропуском нечислових значень (maxNumberSafe).
  • Масив об'єктів: використовуйте maxBy із селектором поля.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.