Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Як знайти максимальний елемент масиву?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Максимальний елемент** невідсортованого масиву знаходиться за O(n). Для невеликих масивів зручно Math.max(...arr); для надійності й великих масивів - звичайний цикл. **Ключове:** не сортуйте масив лише заради максимуму - сортування коштує O(n log n), що гірше за один прохід.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## Коротка відповідь Максимальний елемент невідсортованого масиву знаходиться за 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 із селектором поля.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.