0 / 0 / 0 Регистрация: 12.05.2014 Сообщений: 10 |
|
1 |
|
Найти максимальный элемент в каждой строке массива24.09.2014, 18:44. Показов 7802. Ответов 6
Найти максимальный элемент в каждой строке массива!помогите пожалуйста((
0 |
lawr 385 / 279 / 478 Регистрация: 09.05.2014 Сообщений: 769 |
||||
26.09.2014, 04:31 |
2 |
|||
0 |
Jman 89 / 77 / 38 Регистрация: 11.10.2015 Сообщений: 860 |
||||
19.07.2016, 16:39 |
3 |
|||
Помогите сложить максимальный элемент массива с каждым элементом строки.
0 |
Модератор 13101 / 10373 / 6207 Регистрация: 18.12.2011 Сообщений: 27,749 |
|
19.07.2016, 16:42 |
4 |
По условию надо найти ОДИН максимальный элемент на всю матрицу.
0 |
89 / 77 / 38 Регистрация: 11.10.2015 Сообщений: 860 |
|
19.07.2016, 16:44 |
5 |
Выведите его. Измените текущий массив, прибавив ко всем элементам
0 |
Antony Coder 4 / 3 / 3 Регистрация: 17.07.2016 Сообщений: 17 |
||||
19.07.2016, 17:04 |
6 |
|||
2 |
Jman 89 / 77 / 38 Регистрация: 11.10.2015 Сообщений: 860 |
||||
20.07.2016, 10:33 |
7 |
|||
Спасибо. То что нужно… Дело было в отдельном цикле, где нужно было складывать.. Кому может пригодится с динамическим массивом.
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
20.07.2016, 10:33 |
7 |
namespace ConsoleApplication20
{ class Program
{
static void Main(string[] args)
{
Console.WriteLine("Введите количество элементов в массиве a:");
int n = int.Parse(Console.ReadLine());
int m = int.Parse(Console.ReadLine());
int[,] a = new int[n, m];
int s = 0;
double max = a[0, 0];
Random random = new Random();
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
a[i, j] = random.Next(-100, 100);
if (max < a[i, j])
{ max = a[i, j]; }
else { s += a[i, j];}
Console.Write("{0,4}", a[i, j]);
}
Console.WriteLine();
}
Console.WriteLine("max = {0}", max);
Console.WriteLine("sum = {0}", s);
Console.ReadKey(true);
}}}
задан 18 окт 2018 в 22:37
2
Хех, чисто ради любопытства попробовал сделать по своему. Критерий было несколько компактность, без array (ненавижу их) и с Linq. В итоге получил что то вроде этого:
Console.WriteLine("Введите количество элементов в массиве:");
int.TryParse(Console.ReadLine(), out var items);
int.TryParse(Console.ReadLine(), out var count);
var total = items * count;
var numbers = new List<int>();
var rnd = new Random();
for (var index = 0; index < total; index++)
numbers.Add(rnd.Next(-100, 100));
var max = numbers.Max();
var maxIndex = numbers.FindIndex(x => x == max);
var sumOdd = numbers.Skip(maxIndex + 1).Where(x => x % 2 != 0).Sum();
int current = 0;
var result = numbers.GroupBy(_ => current++ % items).Select(x => x.ToList()).ToList();
Console.WriteLine("Результат:");
result.ForEach(x => Console.WriteLine(string.Join(" ", x)));
Console.WriteLine($"Максимальное: {max}");
Console.WriteLine($"Сумма: {sumOdd}");
Console.ReadKey();
Поясню:
int.TryParse(Console.ReadLine(), out var items);
— Изначально тут мы получим ошибку если пользователь напишет не число, либо вовсе Null. Тут два варианта, либо обрабатывать это, либо использоватьTryParse()
который отдаетbool
и черезout
мы можем получить нашеint
значение.var total = items * count;
— Сама суть всего этого «шаманства» в том, что мы изначально создаем простую коллекцию случайных чисел и потом ее разбиваем на нужные нам части. Вот чтобы не ошибиться потом в разбитие нам стоит для начала посчитать сколько всего чисел должно быть в коллекции.for (var index = 0; index < total; index++)
— Тут самая простая генерация чисел.var max = numbers.Max();
— Получаем самое большое число.var maxIndex = numbers.FindIndex(x => x == max);
— Так, как нам в дальнейшем надо отсечь все доmax
, то нужно узнать индекс этого числа.var sumOdd = numbers.Skip(maxIndex + 1).Where(x => x % 2 != 0).Sum();
— Пропускаем все доmax
(включая его самого), берем все нечетный числа и складываем.var result = numbers.GroupBy(_ => current++ % items).Select(x => x.ToList()).ToList();
— Разбиваем коллекцию на необходимые части. По сути все просто, группируем на нужное кол-во элементов, далее для удобства делаем из этогоList<List<int>>
.
Ну вроде все, выводим это и смотрим результат:
Введите количество элементов в массиве:
5
5
Результат:
-21 -47 8 36 78
18 83 7 29 40
-54 -51 -95 -54 6
-74 -48 69 52 -30
-55 -48 72 -30 83
Максимальное: 83
Сумма: 42
Опять же повторюсь, тут мне чисто стало интересно решить эту задачу иначе, чисто эксперимент. Так что как ответ это вряд ли (ибо вопрос все же как заставить работать код из вопроса), но для развития…, думаю можно почерпнуть немого полезностей.
ответ дан 19 окт 2018 в 4:14
EvgeniyZEvgeniyZ
15.1k2 золотых знака26 серебряных знаков50 бронзовых знаков
6
Вы считаете все числа подряд без разбора на четные и нет. Так же, при определения нового максимума вы не сбрасываете ваш счетчик:
if (max < a[i, j])
{
max = a[i, j];
s = 0;
}
else if (a[i, j] % 2 != 0)
{
s += a[i, j];
}
Так как у вас массив целочисленных значений, следовательно и максимум будет целочисленным: int max = a[0, 0];
ответ дан 18 окт 2018 в 23:06
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace tstCons
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Введите количество элементов в массиве a:");
int n = int.Parse(Console.ReadLine());
int m = int.Parse(Console.ReadLine());
int[,] a = new int[n, m];
int s = 0;
int max = -100; // присваеваем минимальное возможноме значение
int maxI = 0, maxJ = 0; // чтобы запомнить координату максимального элемента
Random random = new Random();
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
a[i, j] = random.Next(-100, 100);
if (max < a[i, j])
{
max = a[i, j];
maxI = i;
maxJ = j;
} // ищем максимум и запоминаем его координаты
Console.Write(a[i, j].ToString() + " ");
}
Console.WriteLine();
}
bool flag = false; //исключим максимальный элемент
for (int i = maxI; i < n; i++)
{
for (int j = maxJ; j < m; j++)
{
if (!flag) // если элемент - максимум, то ничего не делаем
{
flag = true;
continue;
}
if (a[i,j]%2 != 0) s += a[i, j]; // проверяем элемент на четность и увеличеваем счетчик
}
}
Console.WriteLine("max = {0}", max);
Console.WriteLine("sum = {0}", s);
Console.ReadKey(true);
}
}
}
ответ дан 18 окт 2018 в 23:17
Находит максимальное значение элемента в последовательности.
Синтаксис:
max(iterable, *[, key, default]) max(arg1, arg2, *args[, key])
Параметры:
iterable
— итерируемый объект,key
— должна быть функцией (принимает один аргумент), используется для порядка сравнения элементов итерируемого объекта. Функция вычисляется один раз,default
— значение по умолчанию, если итерируемый объект окажется пустым,arg1...argN
— позиционный аргумент,*args
— список позиционных аргументов.
Возвращаемое значение:
- наибольшее значение объекта.
Описание:
Функция max()
возвращает наибольшее значение элемента итерируемого объекта или самое большое из двух или более переданных позиционных аргументов.
- Если указан один позиционный аргумент, он должен быть итерируемым объектом (список, кортеж, словарь и т.д.).
- Если в функцию передается два или более позиционных аргумента, возвращается самый большой из них.
- В случае, когда максимальное значение имеют сразу несколько аргументов. Возвращает первый по порядку элемент с максимальным значением. Это согласуется с другими инструментами сохранения стабильности сортировки, такими как
sorted(iterable, key=keyfunc, reverse=True)[0]
иheapq.nlargest(1, iterable, key=keyfunc)
Аргумент key
— функция подобная той, которая используется в дополнительном методе списков list.sort()
. Функция принимает один аргумент и используется для упорядочивания элементов.
>>> x = ['4', '11', '6', '31'] # функция `max` сравнивает # числа как строки >>> max(x) '6' # функция 'key=lambda i: int(i)' применяется # к каждому элементу списка 'x', преобразуя # строки в тип 'int' и теперь функция `max` # сравнивает элементы списка как числа. >>> max(x, key=lambda i: int(i)) '31' # или другое применение функции 'key' # выбор списка с наибольшей суммой элементов >>> max([1,2,3,4], [3,4,5], key=sum) [3, 4, 5]
Аргумент default
по умолчанию указывает объект, который нужно вернуть, если предоставленный итерируемый объект пуст. Если итерация пуста и значение по умолчанию не указано, то возникает ошибка ValueError
.
# Значение по умолчанию >>> max([], default=10) 10
Функция max()
сравнивает элементы, используя оператор <
. Поэтому, все передаваемые в них значения должны быть сопоставимы друг с другом и одного типа, иначе бросается исключение TypeError
При передаче в качестве аргумента текстовых строк, байтовых строк или байтовых массивов, а так же списка символов, максимальное значение будет выбираться исходя из порядка следования символов, в таблице соответствующей кодировки.
>>> x = list('abcdifgh') >>> max(x) # 'i'
Изменено в Python 3.8: Аргумент key
может быть None
.
Примеры поиска максимального значения в последовательности.
- Нахождение самой длинной строки в списке строк;
- Нахождение максимального значения в списке строк, записанных как целые числа;
- Нахождения максимального значения в строке, которая состоит из чисел и строк;
- Определение индекса у максимального значения в списке;
- Выбор максимального значения для ключа или значения в словаре;
- Нахождение списка с наибольшей суммой элементов в списке списков;
- Нахождение списка с наибольшим количеством элементов в списке списков.
# использование позиционных аргументов >>> max(5, 3, 6, 5, 6) # 6 # использование в качестве аргумента - список >>> max([1.2, 1.3, 1.5, 2, 5.52]) # 5.52 # комбинирование позиционных аргументов и списка # при передаче списка 'x' происходит его распаковка >>> x = (1.2, 1.3, 1.5, 2, 5.52) >>> max(5, 3, 5, *x) # 5,52
Нахождение самой длинной строки в списке строк.
Найдем самую длинную строку. В качестве ключевой функции используем len()
. Она посчитает количество символов в строке каждого элемента списка строк, а функция max()
выберет максимальное число. Строки можно передать например как позиционные аргументы, так и списком ['Jul', 'John', 'Vicky']
, результат будет тот же.
>>> line = ['Jul', 'John', 'Vicky'] >>> max(line, key=len) # 'Vicky'
Нахождение max()
в списке строк, записанных как целые числа.
Есть список строк чисел и необходимо найти максимум, как если бы они были целыми числами? Если применить функцию max()
к исходному списку «как есть», то она выберет наибольшее значение списка исходя из лексикографической сортировки. Для нахождения максимума, как числа, применим функцию lambda i: int(i)
в качестве ключа key
, которая «на лету» преобразует элементы списка в целые числа, тогда функция max()
выберет то что нам нужно.
>>> x = ['4', '11', '6', '31'] >>> max(x) # '6' >>> max(x, key = lambda i: int(i)) # '31'
Нахождения max()
в строке, которая состоит из чисел и строк.
Что бы найти максимум в строке, которая состоит из чисел и строк, необходимо сначала разделить исходную строку на список подстрок. Используем приемы, описанные в примерах функции sum()
:
- по разделителю, например пробелу
' '
или';'
методом строкиstr.split()
, - вытащить все цифры из исходной строки при помощи функцией
re.findall()
.
Затем в цикле перебрать полученный список и все строки с цифрами преобразовать в соответствующие числовые типы и уже потом применить функцию
# исходная строка >>> line = '12; 12,5; 14; один; 15.6; два' # способы преобразования строки в список строк # 1 способ по разделителю ';' >>> line.split(';') # ['12', ' 12,5', ' 14', ' один', ' 15.6', ' два'] # 2 способ по регулярному выражению >>> import re >>> match = re.findall(r'[d.?,?]+', line) >>> list(match) # ['12', '12,5', '14', '15.6']
Далее будем работать с более сложным списком, полученным 1 способом, где встречаются слова. И так, имеем список строк с цифрами и другими строками. Стоит задача: преобразовать строки с цифрами в соответствующие числовые типы и отбросить строки со словами, что бы потом найти максимум.
Задача усложняется тем, что вещественные числа в строках записаны как через запятую, так и через точку. Для необходимых проверок и преобразований определим функцию str_to_num()
.
>>> def str_to_num(str, chars=['.', ',']): ... # убираем начальные и конечные пробелы ... str = str.strip() ... if (any(char in str for char in chars) and ... str.replace('.', '').replace(',', '').isdigit()): ... # если в строке есть точка или запятая и при их замене на '' ... # строка состоит только из цифр то это тип float ... return float(str.replace(',', '.')) ... elif str.isdigit(): ... # если строка состоит только из цифр то это тип int ... return int(str) # полученный список строк 1-м способом >>> str_list = ['12', ' 12,5', ' 14', ' один', ' 15.6', ' два'] # новый список чисел, где будем искать максимум >>> num_list = [] >>> for i in str_list: ... # применим функцию преобразования строки в число ... n = str_to_num(i) ... if n is not None: ... # если функция возвращает число, ... # то добавляем в новый список ... num_list.append(str_to_num(i)) >>> num_list # [12, 12.5, 14, 15.6] >>> max(num_list) # 15.6
Определение индекса у максимального значения в списке.
Допустим есть список чисел и стоит задача, определить индекс максимального значения в этом списке. Для решения этой задачи необходимо пронумеровать список, т.е. создать кортеж — индекс/число, а затем найти максимум, используя в качестве ключа key=lambda i : i[1]
.
>>> lst = [1, 5, 3, 6, 9, 7] # пронумеруем список >>> lst_num = list(enumerate(lst, 0)) >>> lst_num # [(0, 1), (1, 5), (2, 3), (3, 6), (4, 9), (5, 7)] # найдем максимум (из второго значения кортежей) >>> t_max = max(lst_num, key=lambda i : i[1]) >>> t_max # (4, 9) # индекс максимального значения >>> t_max[0] # 4
Нахождение max()
для ключа или значения в словаре dict
.
Допустим есть словарь, задача: найти максимальное значение ключа или самого значения ключа и вывести эту пару.
# имеем словарь >>> d = {1: 3, 2: 4, 1: 9, 4: 1} # преобразуем его в список отображение >>> key_val = d.items() # преобразуем отображение в список # кортежей (ключ, значение) >>> key_val_list = list(key_val) # [(1, 9), (2, 4), (4, 1)]
По умолчанию, при нахождении максимального элемента из списка кортежей будет выбираться кортеж, у которого наибольшее значение имеет ключ исходного словаря (первый элемент в кортеже).
Но если необходимо получить пару (key, value)
, у которого наибольшее значение имеет значение ключа (второй элемент), то для этого нужно применить лямбда-функцию lambda i : i[1]
в качестве аргумента key
функции max()
, которая укажет, из какого элемента кортежа выбирать наибольшее значение.
# происходит сравнение по # первым элементам кортежа >>> kv = max(key_val_list) >>> kv # (4, 1) # максимальное значение ключа в словаре >>> kv[0] # 4 # меняем порядок сравнения >>> kv = max(key_val_list, key=lambda i : i[1]) >>> kv # (1, 9) # максимальное значение в словаре >>> kv[1] # 9 # ключ этого значения в словаре >>> kv[0] # 1 # получаем максимальное значение из словаря >>> d[kv[0]] # 9
Нахождение списка с наибольшей суммой элементов в списке списков.
Для выполнения данной задачи, используем функцию max()
, а в качестве ключевой функции применим встроенную функцию sum()
.
# исходный список >>> lst = [[1, 2, 3], [4, 5], [1, 3, 4, 5], [10, 20]] # выбираем список с наибольшей суммой элементов >>> max(lst, key=sum) # [10, 20]
Выбор списка с наибольшим количеством элементов из списка списков.
Для выполнения данной задачи, используем функцию max()
, а в качестве ключевой функции применим встроенную функцию len()
.
# исходный список >>> lst = [[1, 2, 3], [4, 5], [1, 3, 4, 5], [10, 20]] # выбираем список с наибольшим количеством элементов >>> max(lst, key=len) # [1, 3, 4, 5]
How about augmenting the built-in Array object to use Math.max
/Math.min
instead:
Array.prototype.max = function() {
return Math.max.apply(null, this);
};
Array.prototype.min = function() {
return Math.min.apply(null, this);
};
let p = [35,2,65,7,8,9,12,121,33,99];
console.log(`Max value is: ${p.max()}` +
`nMin value is: ${p.min()}`);
Here is a JSFiddle.
Augmenting the built-ins can cause collisions with other libraries (some see), so you may be more comfortable with just apply
‘ing Math.xxx()
to your array directly:
var min = Math.min.apply(null, arr),
max = Math.max.apply(null, arr);
Alternately, assuming your browser supports ECMAScript 6, you can use spread syntax which functions similarly to the apply
method:
var min = Math.min( ...arr ),
max = Math.max( ...arr );
RobG
141k31 gold badges172 silver badges209 bronze badges
answered Nov 3, 2009 at 18:23
Roatin MarthRoatin Marth
23.5k3 gold badges51 silver badges55 bronze badges
15
Using spread operator (ES6)
Math.max(...array) // The same with "min" => Math.min(...array)
Gass
6,8522 gold badges34 silver badges38 bronze badges
answered Aug 23, 2016 at 16:37
Abdennour TOUMIAbdennour TOUMI
85.4k38 gold badges243 silver badges250 bronze badges
9
For big arrays (~10⁷ elements), Math.min
and Math.max
both produces the following error in Node.js.
RangeError: Maximum call stack size exceeded
A more robust solution is to not add every element to the call stack, but to instead pass an array:
function arrayMin(arr) {
return arr.reduce(function (p, v) {
return ( p < v ? p : v );
});
}
function arrayMax(arr) {
return arr.reduce(function (p, v) {
return ( p > v ? p : v );
});
}
If you are concerned about speed, the following code is ~3 times faster then Math.max.apply
is on my computer. See https://jsben.ch/JPOyL.
function arrayMin(arr) {
var len = arr.length, min = Infinity;
while (len--) {
if (arr[len] < min) {
min = arr[len];
}
}
return min;
};
function arrayMax(arr) {
var len = arr.length, max = -Infinity;
while (len--) {
if (arr[len] > max) {
max = arr[len];
}
}
return max;
};
If your arrays contains strings instead of numbers, you also need to coerce them into numbers. The below code does that, but it slows the code down ~10 times on my machine. See https://jsben.ch/uPipD.
function arrayMin(arr) {
var len = arr.length, min = Infinity;
while (len--) {
if (Number(arr[len]) < min) {
min = Number(arr[len]);
}
}
return min;
};
function arrayMax(arr) {
var len = arr.length, max = -Infinity;
while (len--) {
if (Number(arr[len]) > max) {
max = Number(arr[len]);
}
}
return max;
};
answered Nov 18, 2012 at 14:00
Linus UnnebäckLinus Unnebäck
22.6k14 gold badges73 silver badges89 bronze badges
6
tl;dr
// For regular arrays:
var max = Math.max(...arrayOfNumbers);
// For arrays with tens of thousands of items:
let max = testArray[0];
for (let i = 1; i < testArrayLength; ++i) {
if (testArray[i] > max) {
max = testArray[i];
}
}
MDN solution
The official MDN docs on Math.max()
already covers this issue:
The following function uses Function.prototype.apply() to find the maximum element in a numeric array.
getMaxOfArray([1, 2, 3])
is equivalent toMath.max(1, 2, 3)
, but you can usegetMaxOfArray()
on programmatically constructed arrays of any size.function getMaxOfArray(numArray) { return Math.max.apply(null, numArray); }
Or with the new spread operator, getting the maximum of an array becomes a lot easier.
var arr = [1, 2, 3]; var max = Math.max(...arr);
Maximum size of an array
According to MDN the apply
and spread solutions had a limitation of 65536 that came from the limit of the maximum number of arguments:
But beware: in using apply this way, you run the risk of exceeding the JavaScript engine’s argument length limit. The consequences of applying a function with too many arguments (think more than tens of thousands of arguments) vary across engines (JavaScriptCore has hard-coded argument limit of 65536), because the limit (indeed even the nature of any excessively-large-stack behavior) is unspecified. Some engines will throw an exception. More perniciously, others will arbitrarily limit the number of arguments actually passed to the applied function. To illustrate this latter case: if such an engine had a limit of four arguments (actual limits are of course significantly higher), it would be as if the arguments 5, 6, 2, 3 had been passed to apply in the examples above, rather than the full array.
They even provide a hybrid solution which doesn’t really have good performance compared to other solutions. See performance test below for more.
In 2019 the actual limit is the maximum size of the call stack. For modern Chromium based desktop browsers this means that when it comes to finding min/max with apply
or spread, practically the maximum size for numbers only arrays is ~120000. Above this, there will be a stack overflow and the following error will be thrown:
RangeError: Maximum call stack size exceeded
With the script below (based on this blog post), by catching that error you can calculate the limit for your specific environment.
Warning! Running this script takes time and depending on the performance of your system it might slow or crash your browser/system!
let testArray = Array.from({length: 10000}, () => Math.floor(Math.random() * 2000000));
for (i = 10000; i < 1000000; ++i) {
testArray.push(Math.floor(Math.random() * 2000000));
try {
Math.max.apply(null, testArray);
} catch (e) {
console.log(i);
break;
}
}
Performance on large arrays
Based on the test in EscapeNetscape’s comment I created some benchmarks that tests 5 different methods on a random number only array with 100000 items.
In 2019, the results show that the standard loop (which BTW doesn’t have the size limitation) is the fastest everywhere. apply
and spread comes closely after it, then much later MDN’s hybrid solution then reduce
as the slowest.
Almost all tests gave the same results, except for one where spread somewhy ended up being the slowest.
If you step up your array to have 1 million items, things start to break and you are left with the standard loop as a fast solution and reduce
as a slower.
JSPerf benchmark
JSBen benchmark
JSBench.me benchmark
Benchmark source code
answered Jun 14, 2015 at 21:22
totymedlitotymedli
29k22 gold badges130 silver badges163 bronze badges
4
If you’re paranoid like me about using Math.max.apply
(which could cause errors when given large arrays according to MDN), try this:
function arrayMax(array) {
return array.reduce(function(a, b) {
return Math.max(a, b);
});
}
function arrayMin(array) {
return array.reduce(function(a, b) {
return Math.min(a, b);
});
}
Or, in ES6:
function arrayMax(array) {
return array.reduce((a, b) => Math.max(a, b));
}
function arrayMin(array) {
return array.reduce((a, b) => Math.min(a, b));
}
The anonymous functions are unfortunately necessary (instead of using Math.max.bind(Math)
because reduce
doesn’t just pass a
and b
to its function, but also i
and a reference to the array itself, so we have to ensure we don’t try to call max
on those as well.
answered Jul 27, 2015 at 1:00
7
Alternative Methods
The Math.min
and Math.max
are great methods to get the minimum and maximum item out of a collection of items, however it’s important to be aware of some cavities that can comes with it.
Using them with an array that contains large number of items (more than ~10⁷ items, depends on the user’s browser) most likely will crash and give the following error message:
const arr = Array.from(Array(1000000).keys());
Math.min(arr);
Math.max(arr);
Uncaught RangeError: Maximum call stack size exceeded
UPDATE
Latest browsers might return NaN
instead. That might be a better way to handle errors, however it doesn’t solve the problem just yet.
Instead, consider using something like so:
function maxValue(arr) {
return arr.reduce((max, val) => max > val ? max : val)
}
Or with better run-time:
function maxValue(arr) {
let max = arr[0];
for (let val of arr) {
if (val > max) {
max = val;
}
}
return max;
}
Or to get both Min and Max:
function getMinMax(arr) {
return arr.reduce(({min, max}, v) => ({
min: min < v ? min : v,
max: max > v ? max : v,
}), { min: arr[0], max: arr[0] });
}
Or with even better run-time*:
function getMinMax(arr) {
let min = arr[0];
let max = arr[0];
let i = arr.length;
while (i--) {
min = arr[i] < min ? arr[i] : min;
max = arr[i] > max ? arr[i] : max;
}
return { min, max };
}
* Tested with 1,000,000 items:
Just for a reference, the 1st function run-time (on my machine) was 15.84ms vs 2nd function with only 4.32ms.
answered Oct 2, 2018 at 17:34
Lior ElromLior Elrom
19.4k16 gold badges80 silver badges92 bronze badges
3
Two ways are shorter and easy:
let arr = [2, 6, 1, 0]
Way 1:
let max = Math.max.apply(null, arr)
Way 2:
let max = arr.reduce(function(a, b) {
return Math.max(a, b);
});
answered May 18, 2018 at 1:37
3
.apply
is often used when the intention is to invoke a variadic function with a list of argument values, e.g.
The Math.max([value1[,value2, ...]])
function returns the largest of zero or more numbers.
Math.max(10, 20); // 20
Math.max(-10, -20); // -10
Math.max(-10, 20); // 20
The Math.max()
method doesn’t allow you to pass in an array. If you have a list of values of which you need to get the largest, you would normally call this function using Function.prototype.apply(), e.g.
Math.max.apply(null, [10, 20]); // 20
Math.max.apply(null, [-10, -20]); // -10
Math.max.apply(null, [-10, 20]); // 20
However, as of the ECMAScript 6 you can use the spread operator:
The spread operator allows an expression to be expanded in places where multiple arguments (for function calls) or multiple elements (for array literals) are expected.
Using the spread operator, the above can be rewritten as such:
Math.max(...[10, 20]); // 20
Math.max(...[-10, -20]); // -10
Math.max(...[-10, 20]); // 20
When calling a function using the variadic operator, you can even add additional values, e.g.
Math.max(...[10, 20], 50); // 50
Math.max(...[-10, -20], 50); // 50
Bonus:
Spread operator enables you to use the array literal syntax to create new arrays in situations where in ES5 you would need to fall back to imperative code, using a combination of push
, splice
, etc.
let foo = ['b', 'c'];
let bar = ['a', ...foo, 'd', 'e']; // ['a', 'b', 'c', 'd', 'e']
answered Dec 18, 2014 at 1:38
GajusGajus
67.9k70 gold badges271 silver badges436 bronze badges
1
You do it by extending the Array type:
Array.max = function( array ){
return Math.max.apply( Math, array );
};
Array.min = function( array ){
return Math.min.apply( Math, array );
};
Boosted from here (by John Resig)
answered Nov 3, 2009 at 18:35
brettkellybrettkelly
27.6k8 gold badges56 silver badges71 bronze badges
A simple solution to find the minimum value over an Array
of elements is to use the Array
prototype function reduce
:
A = [4,3,-9,-2,2,1];
A.reduce((min, val) => val < min ? val : min, A[0]); // returns -9
or using JavaScript’s built-in Math.Min() function (thanks @Tenflex):
A.reduce((min,val) => Math.min(min,val), A[0]);
This sets min
to A[0]
, and then checks for A[1]...A[n]
whether it is strictly less than the current min
. If A[i] < min
then min
is updated to A[i]
. When all array elements has been processed, min
is returned as the result.
EDIT: Include position of minimum value:
A = [4,3,-9,-2,2,1];
A.reduce((min, val) => val < min._min ? {_min: val, _idx: min._curr, _curr: min._curr + 1} : {_min: min._min, _idx: min._idx, _curr: min._curr + 1}, {_min: A[0], _idx: 0, _curr: 0}); // returns { _min: -9, _idx: 2, _curr: 6 }
answered Oct 29, 2017 at 11:26
2
For a concise, modern solution, one can perform a reduce
operation over the array, keeping track of the current minimum and maximum values, so the array is only iterated over once (which is optimal). Destructuring assignment is used here for succinctness.
let array = [100, 0, 50];
let [min, max] = array.reduce(([prevMin,prevMax], curr)=>
[Math.min(prevMin, curr), Math.max(prevMax, curr)], [Infinity, -Infinity]);
console.log("Min:", min);
console.log("Max:", max);
To only find either the minimum or maximum, we can use perform a reduce operation in much the same way, but we only need to keep track of the previous optimal value. This method is better than using apply
as it will not cause errors when the array is too large for the stack.
const arr = [-1, 9, 3, -6, 35];
//Only find minimum
const min = arr.reduce((a,b)=>Math.min(a,b), Infinity);
console.log("Min:", min);//-6
//Only find maximum
const max = arr.reduce((a,b)=>Math.max(a,b), -Infinity);
console.log("Max:", max);//35
answered Aug 20, 2020 at 22:47
UnmitigatedUnmitigated
70.4k8 gold badges58 silver badges77 bronze badges
Others have already given some solutions in which they augment Array.prototype
. All I want in this answer is to clarify whether it should be Math.min.apply( Math, array )
or Math.min.apply( null, array )
. So what context should be used, Math
or null
?
When passing null
as a context to apply
, then the context will default to the global object (the window
object in the case of browsers). Passing the Math
object as the context would be the correct solution, but it won’t hurt passing null
either. Here’s an example when null
might cause trouble, when decorating the Math.max
function:
// decorate Math.max
(function (oldMax) {
Math.max = function () {
this.foo(); // call Math.foo, or at least that's what we want
return oldMax.apply(this, arguments);
};
})(Math.max);
Math.foo = function () {
print("foo");
};
Array.prototype.max = function() {
return Math.max.apply(null, this); // <-- passing null as the context
};
var max = [1, 2, 3].max();
print(max);
The above will throw an exception because this.foo
will be evaluated as window.foo
, which is undefined
. If we replace null
with Math
, things will work as expected and the string «foo» will be printed to the screen (I tested this using Mozilla Rhino).
You can pretty much assume that nobody has decorated Math.max
so, passing null
will work without problems.
answered Nov 3, 2009 at 18:39
Ionuț G. StanIonuț G. Stan
175k18 gold badges188 silver badges202 bronze badges
2
One more way to do it:
var arrayMax = Function.prototype.apply.bind(Math.max, null);
Usage:
var max = arrayMax([2, 5, 1]);
gion_13
41k10 gold badges95 silver badges107 bronze badges
answered Sep 26, 2012 at 18:43
sbrsbr
4,6955 gold badges42 silver badges48 bronze badges
2
I am surprised not one mentiond the reduce function.
var arr = [1, 10, 5, 11, 2]
var b = arr.reduce(function(previous,current){
return previous > current ? previous:current
});
b => 11
arr => [1, 10, 5, 11, 2]
2
This may suit your purposes.
Array.prototype.min = function(comparer) {
if (this.length === 0) return null;
if (this.length === 1) return this[0];
comparer = (comparer || Math.min);
var v = this[0];
for (var i = 1; i < this.length; i++) {
v = comparer(this[i], v);
}
return v;
}
Array.prototype.max = function(comparer) {
if (this.length === 0) return null;
if (this.length === 1) return this[0];
comparer = (comparer || Math.max);
var v = this[0];
for (var i = 1; i < this.length; i++) {
v = comparer(this[i], v);
}
return v;
}
answered Nov 3, 2009 at 18:21
ChaosPandionChaosPandion
77.2k18 gold badges118 silver badges156 bronze badges
5
let array = [267, 306, 108]
let longest = Math.max(…array);
answered Oct 3, 2020 at 15:10
Trilok SinghTrilok Singh
1,17712 silver badges9 bronze badges
1
I thought I’d share my simple and easy to understand solution.
For the min:
var arr = [3, 4, 12, 1, 0, 5];
var min = arr[0];
for (var k = 1; k < arr.length; k++) {
if (arr[k] < min) {
min = arr[k];
}
}
console.log("Min is: " + min);
And for the max:
var arr = [3, 4, 12, 1, 0, 5];
var max = arr[0];
for (var k = 1; k < arr.length; k++) {
if (arr[k] > max) {
max = arr[k];
}
}
console.log("Max is: " + max);
answered Oct 13, 2016 at 16:37
Ionut NeculaIonut Necula
11k4 gold badges45 silver badges69 bronze badges
9
For big arrays (~10⁷ elements), Math.min
and Math.max
procuces a RangeError (Maximum call stack size exceeded) in node.js.
For big arrays, a quick & dirty solution is:
Array.prototype.min = function() {
var r = this[0];
this.forEach(function(v,i,a){if (v<r) r=v;});
return r;
};
answered Jan 24, 2012 at 12:43
PeterPeter
5,1085 gold badges29 silver badges38 bronze badges
array.sort((a, b) => b - a)[0];
Gives you the maximum value in an array of numbers.
array.sort((a, b) => a - b)[0];
Gives you the minimum value in an array of numbers.
let array = [0,20,45,85,41,5,7,85,90,111];
let maximum = array.sort((a, b) => b - a)[0];
let minimum = array.sort((a, b) => a - b)[0];
console.log(minimum, maximum)
answered Jun 20, 2020 at 20:33
Adam BelekoAdam Beleko
6387 silver badges15 bronze badges
For an array containing objects instead of numbers:
arr = [
{ name: 'a', value: 5 },
{ name: 'b', value: 3 },
{ name: 'c', value: 4 }
]
You can use reduce
to get the element with the smallest value (min)
arr.reduce((a, b) => a.value < b.value ? a : b)
// { name: 'b', value: 3 }
or the largest value (max)
arr.reduce((a, b) => a.value > b.value ? a : b)
// { name: 'a', value: 5 }
answered Aug 6, 2020 at 12:17
laktaklaktak
56.2k17 gold badges134 silver badges164 bronze badges
Aside using the math function max and min, another function to use is the built in function of sort(): here we go
const nums = [12, 67, 58, 30].sort((x, y) =>
x - y)
let min_val = nums[0]
let max_val = nums[nums.length -1]
answered Feb 14, 2020 at 15:29
1
I had the same problem, I needed to obtain the minimum and maximum values of an array and, to my surprise, there were no built-in functions for arrays. After reading a lot, I decided to test the «top 3» solutions myself:
- discrete solution: a FOR loop to check every element of the array against the current max and/or min value;
- APPLY solution: sending the array to the Math.max and/or Math.min internal functions using apply(null,array);
- REDUCE solution: recursing a check against every element of the array using reduce(function).
The test code was this:
function GetMaxDISCRETE(A)
{ var MaxX=A[0];
for (var X=0;X<A.length;X++)
if (MaxX<A[X])
MaxX=A[X];
return MaxX;
}
function GetMaxAPPLY(A)
{ return Math.max.apply(null,A);
}
function GetMaxREDUCE(A)
{ return A.reduce(function(p,c)
{ return p>c?p:c;
});
}
The array A was filled with 100,000 random integer numbers, each function was executed 10,000 times on Mozilla Firefox 28.0 on an intel Pentium 4 2.99GHz desktop with Windows Vista. The times are in seconds, retrieved by performance.now() function. The results were these, with 3 fractional digits and standard deviation:
- Discrete solution: mean=0.161s, sd=0.078
- APPLY solution: mean=3.571s, sd=0.487
- REDUCE solution: mean=0.350s, sd=0.044
The REDUCE solution was 117% slower than the discrete solution. The APPLY solution was the worse, 2,118% slower than the discrete solution. Besides, as Peter observed, it doesn’t work for large arrays (about more than 1,000,000 elements).
Also, to complete the tests, I tested this extended discrete code:
var MaxX=A[0],MinX=A[0];
for (var X=0;X<A.length;X++)
{ if (MaxX<A[X])
MaxX=A[X];
if (MinX>A[X])
MinX=A[X];
}
The timing: mean=0.218s, sd=0.094
So, it is 35% slower than the simple discrete solution, but it retrieves both the maximum and the minimum values at once (any other solution would take at least twice that to retrieve them). Once the OP needed both values, the discrete solution would be the best choice (even as two separate functions, one for calculating maximum and another for calculating minimum, they would outperform the second best, the REDUCE solution).
answered Apr 2, 2014 at 17:46
CyberknightCyberknight
1562 silver badges6 bronze badges
Iterate through, keeping track as you go.
var min = null;
var max = null;
for (var i = 0, len = arr.length; i < len; ++i)
{
var elem = arr[i];
if (min === null || min > elem) min = elem;
if (max === null || max < elem) max = elem;
}
alert( "min = " + min + ", max = " + max );
This will leave min/max null if there are no elements in the array. Will set min and max in one pass if the array has any elements.
You could also extend Array with a range
method using the above to allow reuse and improve on readability. See a working fiddle at http://jsfiddle.net/9C9fU/
Array.prototype.range = function() {
var min = null,
max = null,
i, len;
for (i = 0, len = this.length; i < len; ++i)
{
var elem = this[i];
if (min === null || min > elem) min = elem;
if (max === null || max < elem) max = elem;
}
return { min: min, max: max }
};
Used as
var arr = [3, 9, 22, -7, 44, 18, 7, 9, 15];
var range = arr.range();
console.log(range.min);
console.log(range.max);
answered Nov 3, 2009 at 18:23
tvanfossontvanfosson
523k99 gold badges697 silver badges794 bronze badges
1
You can use the following function anywhere in your project:
function getMin(array){
return Math.min.apply(Math,array);
}
function getMax(array){
return Math.max.apply(Math,array);
}
And then you can call the functions passing the array:
var myArray = [1,2,3,4,5,6,7];
var maximo = getMax(myArray); //return the highest number
falsarella
12.2k9 gold badges69 silver badges115 bronze badges
answered Aug 26, 2014 at 16:57
The following code works for me :
var valueList = [10,4,17,9,3];
var maxValue = valueList.reduce(function(a, b) { return Math.max(a, b); });
var minValue = valueList.reduce(function(a, b) { return Math.min(a, b); });
Gogol
3,0334 gold badges28 silver badges57 bronze badges
answered May 26, 2017 at 12:40
0
let arr=[20,8,29,76,7,21,9]
Math.max.apply( Math, arr ); // 76
answered Oct 28, 2020 at 21:53
Simple stuff, really.
var arr = [10,20,30,40];
arr.max = function() { return Math.max.apply(Math, this); }; //attach max funct
arr.min = function() { return Math.min.apply(Math, this); }; //attach min funct
alert("min: " + arr.min() + " max: " + arr.max());
falsarella
12.2k9 gold badges69 silver badges115 bronze badges
answered Sep 23, 2014 at 7:48
BrianBrian
3,6531 gold badge22 silver badges33 bronze badges
Here’s one way to get the max value from an array of objects. Create a copy (with slice), then sort the copy in descending order and grab the first item.
var myArray = [
{"ID": 1, "Cost": 200},
{"ID": 2, "Cost": 1000},
{"ID": 3, "Cost": 50},
{"ID": 4, "Cost": 500}
]
maxsort = myArray.slice(0).sort(function(a, b) { return b.ID - a.ID })[0].ID;
falsarella
12.2k9 gold badges69 silver badges115 bronze badges
answered Jan 9, 2014 at 18:46
BenBen
5849 silver badges8 bronze badges
Максимальное число в массиве, как правильнее?
Всем привет.
Есть задачка найти максимальное число в массиве произвольных чисел.
Сделал я так —
var list = [34, 1, 529, -78, 89.7, 1243, 2000, 300000];
function maxElement (list){
let max;
let min = list[0];
for(let i = 0; i < list.length; i++){
if((list[i]) < min){
min = list[i];
} else {
max = list[i];
}
}
return max;
}
console.log(maxElement(list));
Работает все ок, но как правильно будет?
1. Присваивать минимальному значению 0.
2. Или присваивать минимальному значению первый елемент массива тобиш list[0].
-
Вопрос заданболее трёх лет назад
-
31891 просмотр
Конечно же, второй вариант: list[0]
.
Доказательство: найти максимум в массиве отрицательных чисел.
А быстрее встроенным методом Math.max():Math.max.apply(null, list)
Правильно — отказаться от написания собственных велосипедов и использовать то, что уже есть в языке:
Math.max(...list)
Работает все ок…
Не ок. Попробуйте добавить в конец массива ещё одно значение, меньше текущего максимального и больше или равное минимальному. 1, например. И посмотрите, что вернёт ваша функция. Будете удивлены.
Еще так:
function max(list) {
return list.reduce((a, b) => a > b ? a : b);
}
Еще так:
function max(list) {
let max = list[0];
list.forEach(function(e) {
if (e > max) max = e;
});
return max;
}
Пригласить эксперта
А чем обычный sort не походит?
-
Показать ещё
Загружается…
26 мая 2023, в 01:06
500 руб./за проект
26 мая 2023, в 00:08
2500 руб./за проект
25 мая 2023, в 22:01
2000 руб./за проект