Как найти min элемент в массиве

Максимальный и минимальныйЗадачи по нахождению минимального и/или максимального элемента в массиве очень часто встречаются в различных учебных пособиях по программированию и, как правило, вызывают трудности у начинающих программистов или просто студентов, получивших такое задание.

В данной статье вы узнаете, как написать реализацию программы на языке C++, которая находит максимальный и минимальный элемент в массиве и выводит на экран. А узнать множество решений других задач можно в разделе с решениями задач по программированию на языке C++.

Что такое максимальный и минимальный элемент массива

Для начала поймем, что же такое максимальный или минимальный элемент в массиве? Всё просто, максимальный элемент массива — это элемент, который имеет самое большое числовое значение, а минимальный элемент массива — это элемент, имеющий самое маленькое значение.

Пример: в массиве, состоящем из таких элементов: 3, 1, 0, -4, 16, 2 — максимальный элемент равен 16, т.к. это число больше других, а минимальный элемент равен -4, т.к. оно меньше остальных.

Поняв это, можно приступить к решению задачи.

Алгоритм решения задачи

— Инициализация массива, переменных, хранящих минимальное и максимальное значение.

— Заполнение массива случайными числами при помощи цикла и функции, возвращающей случайные числа.

— Вывод массива.

— Сравнение каждого элемента массива: Если элемент больше переменной с максимальным значением, то значение записывается в переменную; Если элемент меньше переменной с минимальным значением, то значение записывается в переменную.

— Вывод переменных с максимальным и минимальным элементом.

Алгоритм решения на языке C++

Для начала нужно подключить заголовок ввода/вывода <iostream>, заголовок стандартных функций <cstdlib> в ней имеется функция rand(), которая позволит заполнить массив случайными числами. Заполнение каждого элемента массива вручную требует времени, его можно сэкономить автоматизировав процесс. Подключаем пространство имён std. Создаём константу N, она будет определять количество элементов в массиве.

#include <iostream> 
#include <cstdlib> 

using namespace std; //Пространство имён std

const int N = 10;//Количество элементов в массиве

int main() 
{

	return 0;
}

В теле функции main() инициализируем массив целых чисел из N лементов, целочисленные переменные max и min, они будут хранить значение максимального и минимального элементов массива соответственно.

	int mass[N], max, min;

Теперь заполним массив случайными числами. Для этого используем цикл от 0 до N (не включительно), который пройдется по каждому элементу массива и поместит случайное значение от 0 до 98. Это можно сделать, использовав функцию rand(), которая возвращает случайное число. Поделить возвращаемое значение на 99 и внести в ячейку остаток от деления, таким образом значение ячейки будет иметь значение в диапазоне от 0 до 99(не включая 99, т.к. остаток от деления не может быть кратным делителю).  При этом выведем значения элементов массива на экран.

	cout << "Элементы: |";
	for(int r = 0; r<N; r++) // Цикл от 0 до N
	{
		mass[r] = rand()%99; // Заполнение случайным числом
		cout << mass[r] << "|"; // Вывод значения
	}
	cout << endl;

В результате программа выведет на экран значения элементов массива, разделенное вертикальными чертами:

Элементы: |28|43|72|79|23|70|55|39|69|1|

Обратите внимание! Если вы программируете под Windows и у Вас не отображаются русские символы в консоли, то советую Вам почитать о решении этой проблемы в статье Русские символы(буквы) при вводе/выводе в консоль на C++.

Далее определим максимальный и минимальный элемент в массиве, для этого вновь пройдемся по массиву циклом. При помощи условия определим максимальный и минимальный элемент массива.

Перед циклом нужно будет занести первый элемент массива в переменные min и max, они будут хранить минимальное и максимальное значение изначально, а во время цикла поменяют его, если найдётся значение меньше для min или больше для max.

	max = mass[0];//Помещаем значения 1-го элемента
	min = mass[0];//массива в переменные
	for(int r = 1; r<N; r++)
	{
		if(max < mass[r]) max = mass[r]; //если значение элемента больше значения переменной max, то записываем это значение в переменную
		if(min > mass[r]) min = mass[r]; //аналогично и для min
	}

После цикла выведем значения min и max.

	cout << "Min: " << min << endl;
	cout << "Max: " << max << endl;

После компиляции и запуска прогамма выводит следующее

Элементы: |28|43|72|79|23|70|55|39|69|1|
Min: 1
Max: 79

Пробегаемся по элементам массива глазами и видим, что минимальное значение — 1, а максимальное — 79. Переменные min и max имеют эти же значения соответственно, следовательно алгоритм работает.

Весь листинг программы на C++

#include <iostream>
#include <cstdlib>

using namespace std;

const int N = 10;

int main() 
{
	int mass[N], max, min;

	cout << "Элементы: |";
	for(int r = 0; r<N; r++)
	{
		mass[r] = rand()%99;
		cout << mass[r] << "|";
	}
	cout << endl;
	
	max = mass[0];
	min = mass[0];
	for(int r = 1; r<N; r++)
	{
		if(max < mass[r]) max = mass[r];
		if(min > mass[r]) min = mass[r];
	}
	cout << "Min: " << min << endl;
	cout << "Max: " << max << endl;
	
	return 0;
}

Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Like Article

    The minimum and maximum elements in an array can be found using 2 approaches: 

    Method 1: Using Math.min() and Math.max() The min() and max() methods of the Math object are static functions that return the minimum and maximum element passed to it. These functions could be passed into an array with the spread(…) operator. The spread operator allows an iterable to expand in places where multiple arguments are expected. In this case, it automatically expands the array and gives the numbers to the functions. 

    Syntax:

    minValue = Math.min(...array);
    maxValue = Math.max(...array);

    Example: In this example, we will see the basic implementation of Javascript Math.min() and Math.max() functions.

    HTML

    <body>

        <h1 style="color: green">

            GeeksforGeeks

        </h1>

        <b>Find the min/max element of

            an Array using JavaScript</b>

        <p>Click on the button below t

            o find out the minimum and

            maximum of the array

            [50, 60, 20, 10, 40]</p>

        <p>Minimum element is: <span class="min">

            </span>

            <br>Maximum Element is: <span class="max">

            </span>

        </p>

        <button onclick="findMinMax()">

            Click to check

        </button>

        <script>

            function findMinMax() {

                array = [50, 60, 20, 10, 40];

                minValue = Math.min(...array);

                maxValue = Math.max(...array);

                document.querySelector(

                '.min').textContent = minValue;

                document.querySelector(

                '.max').textContent = maxValue;

            }

        </script>

    </body>

    Output:

    Method 2: Iterating through the array and keeping track of the minimum and maximum element The minimum and maximum element can be kept track by iterating through all the elements in the array and updating the minimum and maximum element up to that point by comparing them to the current minimum and maximum values. Initially, the minimum and maximum values are initialized to Infinity and -Infinity. 

    Syntax:

    minValue = Infinity;
    maxValue = -Infinity;
    
    for (item of array) {
        // find minimum value
        if (item < minValue)
        minValue = item;
                    
        // find maximum value
        if (item > maxValue)
        maxValue = item;
    }

    Example: In this example, we will be iterating through the elements of the array to find the max and min elements from the array.

    html

    <h1 style="color: green">

        GeeksforGeeks

    </h1>

    <b>

        Find the min/max element

        of an Array using JavaScript

    </b>

    <p>

        Click on the button below to

        find out the minimum and

        maximum of the array

        [50, 60, 20, 10, 40]

    </p>

    <p>Minimum element is: <span class="min">

        </span>

        <br>Maximum Element is: <span class="max">

        </span>

    </p>

    <button onclick="findMinMax()">

        Click to check

    </button>

    <script>

        function findMinMax() {

            array = [50, 60, 20, 10, 40];

            minValue = Infinity;

            maxValue = -Infinity;

            for (item of array) {

                // find minimum value

                if (item < minValue)

                    minValue = item;

                // find maximum value

                if (item > maxValue)

                    maxValue = item;

            }

            document.querySelector(

            '.min').textContent = minValue;

            document.querySelector(

            '.max').textContent = maxValue;

        }

    </script>

    Output:

    Last Updated :
    13 Dec, 2022

    Like Article

    Save Article

    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's user avatar

    RobG

    141k31 gold badges172 silver badges209 bronze badges

    answered Nov 3, 2009 at 18:23

    Roatin Marth's user avatar

    Roatin MarthRoatin Marth

    23.4k3 gold badges51 silver badges55 bronze badges

    15

    Using spread operator (ES6)

    Math.max(...array)  // The same with "min" => Math.min(...array)
    

    Gass's user avatar

    Gass

    6,7822 gold badges34 silver badges38 bronze badges

    answered Aug 23, 2016 at 16:37

    Abdennour TOUMI's user avatar

    Abdennour TOUMIAbdennour TOUMI

    85.2k38 gold badges242 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;
    };
    

    EscapeNetscape's user avatar

    answered Nov 18, 2012 at 14:00

    Linus Unnebäck's user avatar

    Linus UnnebäckLinus Unnebäck

    22.5k14 gold badges72 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 to Math.max(1, 2, 3), but you can use getMaxOfArray() 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

    jsperf.com benchmark results for different solutions to find the min/max item of an array

    JSBen benchmark

    jsben.com benchmark results for different solutions to find the min/max item of an array

    JSBench.me benchmark

    jsbench.me benchmark results for different solutions to find the min/max item of an array

    Benchmark source code

    answered Jun 14, 2015 at 21:22

    totymedli's user avatar

    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

    Daniel Buckmaster's user avatar

    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 Elrom's user avatar

    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

    Hafizur Rahman's user avatar

    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

    Gajus's user avatar

    GajusGajus

    67.7k70 gold badges271 silver badges434 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

    brettkelly's user avatar

    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

    Nicolas Lykke Iversen's user avatar

    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

    Unmitigated's user avatar

    UnmitigatedUnmitigated

    69.8k8 gold badges56 silver badges76 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. Stan's user avatar

    Ionuț G. StanIonuț G. Stan

    175k18 gold badges188 silver badges201 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's user avatar

    gion_13

    41k10 gold badges95 silver badges107 bronze badges

    answered Sep 26, 2012 at 18:43

    sbr's user avatar

    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

    ChaosPandion's user avatar

    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 Singh's user avatar

    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 Necula's user avatar

    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

    Peter's user avatar

    PeterPeter

    5,0985 gold badges29 silver badges38 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

    laktak's user avatar

    laktaklaktak

    56.1k17 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]
    

    black.swordsman's user avatar

    answered Feb 14, 2020 at 15:29

    Chukwuemeka Maduekwe's user avatar

    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:

    1. discrete solution: a FOR loop to check every element of the array against the current max and/or min value;
    2. APPLY solution: sending the array to the Math.max and/or Math.min internal functions using apply(null,array);
    3. 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:

    1. Discrete solution: mean=0.161s, sd=0.078
    2. APPLY solution: mean=3.571s, sd=0.487
    3. 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

    Cyberknight's user avatar

    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

    tvanfosson's user avatar

    tvanfossontvanfosson

    522k99 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's user avatar

    falsarella

    12.2k9 gold badges69 silver badges115 bronze badges

    answered Aug 26, 2014 at 16:57

    Max Cabrera's user avatar

    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's user avatar

    Gogol

    3,0334 gold badges28 silver badges57 bronze badges

    answered May 26, 2017 at 12:40

    jaydip jadhav's user avatar

    0

    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 Beleko's user avatar

    Adam BelekoAdam Beleko

    6287 silver badges14 bronze badges

    let arr=[20,8,29,76,7,21,9]
    Math.max.apply( Math, arr ); // 76

    answered Oct 28, 2020 at 21:53

    Shashwat Gupta's user avatar

    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's user avatar

    falsarella

    12.2k9 gold badges69 silver badges115 bronze badges

    answered Sep 23, 2014 at 7:48

    Brian's user avatar

    BrianBrian

    3,6431 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's user avatar

    falsarella

    12.2k9 gold badges69 silver badges115 bronze badges

    answered Jan 9, 2014 at 18:46

    Ben's user avatar

    BenBen

    5849 silver badges8 bronze badges

     В этой статье рассмотрены два способа нахождения минимального (максимального) элемента массива, а также задачи с применением этих способов.

    1 способ

    Задача 1: Дан одномерный массив, состоящий из n целых чисел. Найти минимальный элемент массива. В первой строке вводится количество чисел в массиве n. Затем выводятся сами числа, заданные случайным образом. В третьей строке выводится результат: минимальный элемент массива.

    Исходные данные:

    Результат:

    10
    5  -2  14  7  -4  23  0  8  6  -1

    -4

    10
    0  4  5  2  77  62  4  8  0  45

    0

    Считаем, что первый элемент массива – минимальный.  Затем, сравниваем, начиная со второго до последнего все элементы массива с минимальным. Используем для этого цикл. Если очередной элемент на каком-то шаге цикла оказывается меньше минимального, то значение минимального изменяем, присвоив ему значение этого очередного элемента. По окончании цикла выводим результат: минимальный элемент.

    program min1;
    var a:array[1..100] of integer;
    i,min,n:integer;
    begin
    //заполнение массива и вывод массива в строчку
    readln(n);
    for i:=1 to n do begin
    a[i]:=random(-100,100);
    write(a[i],’ ‘);
    end;
    //нахождение минимального элемента массива
    min:=a[1];
    for i:=2 to n do
    if min>=a[i] then min:=a[i];
    //вывод результата
    writeln;
    write(min);
    end.

    Заметим, что для нахождения максимального элемента массива достаточно заменить имя переменной min на max и знак >= на знак <=.

    Задача 2: Дан одномерный массив, состоящий из n целых чисел. Найти индекс минимального элемент массива. В первой строке вводится количество чисел в массиве n. Затем выводится массив, заданный случайным образом. В третьей строке выводится результат: индекс минимального элемент массива.

    Исходные данные:

    Результат:

    10
    5  -2  14  7  -4  23  0  8  6  -1

    5

    10
    0  4  5  2  77  62  4  8  0  45

    9

    Если в задаче требуется найти индекс минимального (максимального), то вводим переменную imin, в которую будем запоминать индекс минимального (максимального), причем первоначально ее значение равно 1.

    program min2;
    var a:array[1..100] of integer;
    i,min,n,imin:integer;
    begin
    //заполнение массива и вывод массива в строчку
    readln(n);
    for i:=1 to n do begin
    a[i]:=random(-100,100);
    write(a[i],’ ‘);
    end;
    //нахождение индекса минимального элемента массива
    min:=a[1];
    imin:=1;
    for i:=2 to n do
    if min>=a[i] then begin
    imin:=i;
    min:=a[i];
    end;
    //вывод результата
    writeln;
    write(imin);
    end.

    Если в массиве есть несколько равных между собой минимальных элементов, то данная программа найдет номер последнего (правого) элемента. Для того чтобы найти индекс первого (левого) элемента достаточно изменить знак  >= на строгий знак >.
    Эту программу можно оптимизировать, так как, зная индекс минимального элемента, можно найти значение минимального элемента массива. Значит, переменная min не нужна:

    var a:array[1..100] of integer;
    i,n,imin:integer;

    Фрагмент нахождения индекса минимального элемента массива выглядит так:

    imin:=1;
    for i:=2 to n do
    if a[imin]>=a[i] then imin:=i;

    Задача 3: Дан одномерный массив, состоящий из n целых чисел. Найти количество минимальных элементов массива. В первой строке вводится количество чисел в массиве n. Затем выводится массив, заданный случайным образом. В третьей строке выводится результат: количество минимальных элементов массива.

    Исходные данные:

    Результат:

    10
    5  -2  14  7  -4  23  0  8  -4  -1

    2

    10
    0  4  5  2  77  0  4  8  0  45

    3

    program min3;
    var a:array[1..100] of integer;
    i,min,n,k:integer;
    begin
    //заполнение массива и вывод массива в строчку
    readln(n);
    for i:=1 to n do begin
    a[i]:=random(-5,5);
    write(a[i],’ ‘);
    end;
    //нахождение минимального элемента массива
    min:=a[1];
    for i:=2 to n do
    if min>=a[i] then
    min:=a[i];
    //считаем количество равных элементов
    k:=0;
    for i:=1 to n do
    if a[i]=min then k:=k+1;
    //вывод результата
    writeln;
    write(k);
    end.

    Задача 4: Дан целочисленный массив из n элементов. Элементы массива могут принимать целые значения от 0 до 1000. Напишите программу, находящую минимальное значение среди элементов массива, которые имеют чётное значение и не делятся на четыре. Гарантируется, что в исходном массиве есть хотя бы один элемент, значение которого чётно и не кратно четырем. В первой строке вводится количество чисел в массиве n. Затем выводится массив, заданный случайным образом. В третьей строке выводится результат: минимальное значение среди элементов массива, которые имеют чётное значение и не делятся на четыре.

    Исходные данные:

    Результат:

    10
    5  -2  14  7  -4  22  0  -8  -6  -1

    -6

    10
    0  4  5  -10  77  0  4  -12  0  45

    -10

    В этой задаче первый способ нахождения минимального не подойдет. Первый элемент массива может оказаться меньше, чем минимальный четный и не кратный четырем и программа выведет неверный результат. Каким должно быть начальное значение переменной min? Его нужно выбрать таким, чтобы для первого же «подходящего» элемента выполнилось условие a[i] < min, и это «временное» начальное значение было бы заменено на реальное. Такое «подходящее» обязательно будет, так как это гарантировано условием задачи. Оно должно быть большим и таким, какое не может быть по условию задачи, например, 1001.

    Кроме того заметим, что задавать элементы массива нужно с клавиатуры, чтобы обеспечить условия задачи.

    Итак, находим минимальный элемент вторым способом.

    2 способ

    Записываем в переменную min значение 1001. Затем в цикле просматриваем все элементы массива, с первого до последнего. Если остаток от деления очередного элемента на 2 равен 0 и остаток от его деления на 4 не равен нулю и значение элемента меньше, чем значение переменной min, сохраняем в переменную min значение очередного элемента массива. После окончания работы цикла выводим значение переменной min.

    program min4;
    var a:array[1..100] of integer;
    i,min,n:integer;
    begin
    //заполнение массива и вывод массива в строчку
    readln(n);
    for i:=1 to n do
    readln(a[i]);
    for i:=1 to n do
    write(a[i],’ ‘);
    //нахождение минимального элемента массива
    min:=1001;
    for i:=1 to N do
    if (a[i] mod 2=0) and (a[i] mod 4 <> 0) and (a[i]<min) then
      min:=a[i];
    //вывод результата
    writeln;
    write(min);
    end.

    Проверяем на тестах:

    10
    411 837 755 90 520 203 581 798 401 640

    90

    10
    195 264 127 936 658 152 339 504 395 553

    658

     Конечно, решить эту задачу можно и первым способом, но для нахождения первого значения min нужно написать дополнительные команды поиска. Вот таким может быть решение:

    program min5;
    var a:array[1..100] of integer;
    i,min,n,j:integer;
    begin
    //заполнение массива и вывод массива в строчку
    readln(n);
    for i:=1 to n do
    readln(a[i]);
    for i:=1 to n do
    write(a[i],’ ‘);
    //нахождение первого четного и не кратного 4 числа
    i:=1;
    while (i<=n)and not((a[i] mod 2=0) and (a[i] mod 4 <> 0)) do i:=i+1;
    //в переменной i запомнился номер первого элемента, удовлетворяющего условию
    //нахождение минимального, начиная со следующего за найденным
    min:=a[i];
    for j:=i+1 to N do
    if (a[j] mod 2=0) and (a[j] mod 4 <> 0) and (a[j]<min) then
      min:=a[j];
    //вывод результата
    writeln;
    write(min);
    end.

    Задача 5: Дан целочисленный массив из n элементов. Элементы массива могут принимать произвольные целые значения. Напишите программу, которая находит и выводит второй максимум массива (элемент, который в отсортированном по невозрастанию массиве стоял бы вторым).

    Исходные данные:

    Результат:

    10
    5  -2  14  7  -4  22  0  -8  -6  -1

    14

    10
    0  4  5  -10  77  0  4  -12  0  45

    45

    Мы знаем, как найти первый максимум, а в этой задаче нужно найти второй по величине максимум. Попробуем это сделать это за один проход по массиву. Нам нужны две переменные, max1 (максимальный элемент) и max2 (второй максимум). Сначала выбираем максимальный из первых двух элементов и записываем его значение в max1, а второй по величине записываем в max2.

    Затем в цикле перебираем все элементы, начиная с 3-го до последнего. Если очередной элемент a[i] больше, чем max1, записываем значение max1 в max2 (предыдущий максимум становится вторым), а значение a[i] – в max1. Иначе, если a[i] больше, чем max2, записываем значение a[i] в max2. После завершения цикла выводим значение переменной max2.

    program min6;
    var a: array [1..100] of integer;
    i, k,n, max1, max2: integer;
    begin
      //заполнение массива и вывод массива в строчку
    readln(n);
    for i:=1 to n do begin
    a[i]:=random(0,100);
    write(a[i],’ ‘);
    end;
    //начальные значения max1 и max2
    if a[1] > a[2] then begin
    max1:=a[1]; max2:=a[2]
    end
    else begin
    max1:=a[2]; max2:=a[1]
    end;
    // поиск второго максимального
    for i:=3 to N do
    if a[i] > max1 then begin
    max2:= max1;
    max1:= a[i]
    end
    else
    if a[i] > max2 then max2:=a[i];
    //вывод результата
    writeln;
    writeln(max2);
    end.

    Задача 6: Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 1 до 10000 включительно. Напишите программу, позволяющую найти и вывести минимальный элемент массива, шестнадцатеричная запись которого содержит ровно две цифры, причём первая (старшая) цифра больше второй (младшей).  Если таких чисел нет, нужно вывести ответ 0.

    Исходные данные:

    Результат:

    20
    5  -2  14  7  -4  22  0  -8  -6  -1

    14

    10
    0  4  5  -10  77  0  4  -12  0  45

    45

    Эта задача усложнена только тем, что элементы массива должны быть в диапазоне от 16 до 255. В этом случае первая цифра находится как результат деления нацело на 16, а вторая цифра – как остаток от деления на 16.

    Кроме этого здесь массив можно объявить через константу n, так как размер массива задан явно: 20 элементов.

    program z6;
    //объявление массива через константу
    const n=20;
    var a: array [1..n] of integer;
    i,min: integer;
    begin
      //заполнение массива и вывод массива в строчку
    for i:=1 to n do begin
    a[i]:=random(0,10000);
    write(a[i],’ ‘);
    end;
    writeln;
    min := 10001;
    for i := 1 to n do begin
    //для проверки правильности программы выведем две шестнадцатеричные цифры:
    //write(a[i] div 16,a[i] mod 16,’ ‘);
    if (16 <= a[i]) and (a[i] < 256) and (a[i] div 16 > a[i] mod 16) and (a[i] < min) then
        min := a[i];
    end;
    writeln;
    //вывод результата
    if min = 10001 then
      writeln(0)
    else
      writeln(min);
    end.

    Задачи для самостоятельного решения:

    1. Дан целочисленный массив из n элементов. Элементы могут принимать значения от 150 до 210 ­– рост учащихся выпускного класса. В волейбольную команду берут тех, чей рост не менее 170 см. Напишите программу, которая определяет и выводит минимальный рост игрока баскетбольной команды. Гарантируется, что хотя бы один ученик играет в баскетбольной команде.
    2. Дан целочисленный массив из n элементов. Элементы массива могут принимать целые значения от 0 до 100 – баллы учащихся выпускного класса за экзамен по информатике. Для получения положительной оценки за экзамен требовалось набрать не менее 50 баллов. Напишите программу, которая находит и выводит минимальный балл среди учащихся, получивших за экзамен положительную оценку. Известно, что в классе хотя бы один учащийся получил за экзамен положительную оценку.
    3. Дан целочисленный массив – сведения о температуре за каждый день октября. Элементы массива могут принимать целочисленные значение значения от -15 до 20. Напишите программу, которая находит и выводит максимальную температуру среди дней, когда были заморозки (температура опускалась ниже нуля). Гарантируется, что хотя бы один день в октябре была отрицательная температура.
    4. Дан целочисленный массив из n элементов, все элементы которого – неотрицательные числа, не превосходящие 10000. Напишите программу, которая находит и выводит минимальное трехзначное число, записанное в этом массиве. Если таких чисел нет, нужно вывести сообщение «Таких чисел нет».
    5. Дан целочисленный массив из n элементов. Элементы массива могут принимать целые значения от 1 до 10000 включительно. Напишите программу, позволяющую найти и вывести наибольший из элементов массива, шестнадцатеричная запись которого оканчивается на букву F. Если таких чисел нет, нужно вывести ответ 0.
    6. Дан целочисленный массив из n элементов. Элементы массива могут принимать произвольные целые значения. Напишите программу, которая находит и выводит номера двух элементов массива, сумма которых минимальна.
    7. Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 1 до 10000 включительно. Напишите программу, находящую минимальный элементов массива, шестнадцатеричная запись которого содержит ровно две цифры, причём вторая (младшая) цифра – это буква (от A до F). Если таких чисел нет, нужно вывести ответ 0.

    Источники информации

    1. Угринович Н.Д. Информатика и информационные технологии. Учебник для 10-11 классов/ Н.Д. Угринович. – М.:Бином. Лаборатория знаний, 2005.
    2. Сайт К. Полякова http://kpolyakov.spb.ru/school/ege.htm

    Самый простой способ

    Разумеется, проще всего получить минимальный и максимальный элементы массива с помощью функций min() и max():

    $arr = [8, 4, 12, 9];
    $max = max($arr); // 12
    $min = min($arr); // 4

    Однако на форумах часто просят написать скрипт, не использующий эти функции. Чаще всего этого требуют преподаватели учебных учреждений.

    Условия задачи

    1. Найти наибольший наименьший элементы в одномерном числовом массиве.
    2. Определить номер минимального и максимального элементов заданного одномерного массива.
    3. Найти минимальное и максимальное значение в ассоциативном массиве.

    Общий принцип поиска элементов

    Во всех решениях мы будем использовать одну и ту же логику.

    Согласно условию, нам необходимо объявить числовой массив произвольной длины. Также объявим 4 переменные, в которые будем помещать найденные значения и их ключи:

    <?php
    $arr = [12, 4, 182, 1, 2.587];
    $min = null;
    $min_key = null;
    $max = null;
    $max_key = null;

    Далее перебираем массив в цикле и на каждой итерации проверяем, больше ли текущее значение, чем самое большое, что мы находили до этого.

    И если больше – будем записывать в $max новое максимальное значение, а в $max_key его ключ. Абсолютно также поступим и с минимальными ключом и значением.

    Пример с циклом foreach:

    foreach($arr as $k => $v)
    {
    	if($v > $max)
    	{
    		$max = $v;
    		$max_key = $k;
    	}
    
    	if($v < $min)
    	{
    		$min = $v;
    		$min_key = $k;
    	}
    }

    На данном этапе наш код уже будет работать, но это ещё не всё. Попробуем изменить исходный массив и посмотрим на результат:

    <?php
    $arr = [0, -12];
    $max = null;
    
    foreach($arr as $v)
    {
    	if($v > $max)
    		$max = $v;
    }
    
    var_dump($max); // -12

    Максимальным должно быть число 0, но скрипт вывел -12. Дело в том, что PHP не считает истинным выражение 0 > null, поэтому ноль на первой итерации цикла не записался в переменную $max.

    Для решения этой проблемы просто добавим условие, что если $max === null, т.е. если это первая итерация, то в любом случае записываем текущее значение в $min и $max:

    <?php
    $arr = [0, -12];
    $max = null;
    
    foreach($arr as $v)
    {
        if($v > $max or $max === null)
            $max = $v;
    }
    
    var_dump($max); // -12

    Минимальный и максимальный элементы с циклом FOREACH

    Решение:

    <?php
    $arr = [12, 4, 182, 1, 2.587];
    $min = null;
    $min_key = null;
    $max = null;
    $max_key = null;
    
    foreach($arr as $k => $v)
    {
    	if($v > $max or $max === null)
    	{
    		$max = $v;
    		$max_key = $k;
    	}
    
    	if($v < $min or $min === null)
    	{
    		$min = $v;
    		$min_key = $k;
    	}
    }
    
    echo "Min value: $min <br> Min key: $min_key <br>";
    echo "Max value: $max <br> Max key: $max_key";

    Минимальный и максимальный элементы с циклом WHILE

    Решение 1: счётчик + count()

    Цикл будет выполняться до тех пор, пока значение счётчика $i не превысит количество элементов массива.

    <?php
    $arr = [12, 4, 182, 1, 2.587];
    $min = null;
    $min_key = null;
    $max = null;
    $max_key = null;
    $i = 0;
    
    while($i < count($arr))
    {
        if($arr[$i] > $max or $max === null)
        {
            $max = $arr[$i];
            $max_key = $i;
        }
    
        if($arr[$i] < $min or $min === null)
        {
            $min = $arr[$i];
            $min_key = $i;
        }
    
    	$i++;
    }
    
    echo "Min value: $min <br> Min key: $min_key <br>";
    echo "Max value: $max <br> Max key: $max_key";

    Решение 2: счётчик + isset()

    Запускаем вечный цикл while и в каждой итерации цикла проверяем существование следующего элемента с помощью isset(). Если его нет – выходим из цикла оператором break:

    <?php
    $arr = [12, 4, 182, 1, 2.587];
    $min = null;
    $min_key = null;
    $max = null;
    $max_key = null;
    $i = 0;
    
    while(true)
    {
    	if(isset($arr[$i]))
    	{
    		if($arr[$i] > $max or $max === null)
    		{
    			$max = $arr[$i];
    			$max_key = $i;
    		}
    
    		if($arr[$i] < $min or $min === null)
    		{
    			$min = $arr[$i];
    			$min_key = $i;
    		}
    	}
    	else
    		break;
    
    	$i++;
    }
    
    echo "Min value: $min <br> Min key: $min_key <br>";
    echo "Max value: $max <br> Max key: $max_key";

    Решение 3: list() + each()

    Функция each() возвращает ключ и значение текущего элемента массива и смещает его внутренний указатель на единицу. Функция list() используется просто для удобства – с её помощью мы превращаем массив, который возвращает функция each, в две разные переменные:

    <?php
    $arr = [12, 4, 182, 1, 2.587];
    $min = null;
    $min_key = null;
    $max = null;
    $max_key = null;
    $i = 0;
    
    while(list($k, $v) = each($arr))
    {
    	if($v > $max or $max === null)
    	{
    		$max = $v;
    		$max_key = $k;
    	}
    
    	if($v < $min or $min === null)
    	{
    		$min = $v;
    		$min_key = $k;
    	}
    }
    
    echo "Min value: $min <br> Min key: $min_key <br>";
    echo "Max value: $max <br> Max key: $max_key";

    Получился практически аналог foreach. Единственный минус в том, что начиная с PHP 7.2 функция each() объявлена устаревшей.

    Решение 4: current() + next()

    Это решение похоже на предыдущее с each(). Получаем текущий элемента массива функцией current() и смещаем внутренний указатель массива функцией next(). Получить текущий ключ массива можно с помощью функции key().

    <?php
    $arr = [12, 4, 182, 1, 2.587];
    $min = null;
    $min_key = null;
    $max = null;
    $max_key = null;
    $i = 0;
    
    while($v = current($arr))
    {
    	if($v > $max or $max === null)
    	{
    		$max = $v;
    		$max_key = key($arr);
    	}
    
    	if($v < $min or $min === null)
    	{
    		$min = $v;
    		$min_key = key($arr);
    	}
    
    	next($arr);
    }
    
    echo "Min value: $min <br> Min key: $min_key <br>";
    echo "Max value: $max <br> Max key: $max_key";

    Наибольший и наименьший элементы с циклом FOR

    Решение 1: счётчик + count()

    Вводим счётчик $i и увеличиваем его после каждой итерации. Цикл прекратится как только значение счётчика превысит количество элементов массива.

    <?php
    $arr = [12, 4, 182, 1, 2.587];
    $min = null;
    $min_key = null;
    $max = null;
    $max_key = null;
    
    for($i = 0; $i < count($arr); $i++)
    {
        if($arr[$i] > $max or $max === null)
        {
            $max = $arr[$i];
            $max_key = $i;
        }
    
        if($arr[$i] < $min or $min === null)
        {
            $min = $arr[$i];
            $min_key = $i;
        }
    }
    
    echo "Min value: $min <br> Min key: $min_key <br>";
    echo "Max value: $max <br> Max key: $max_key";

    Решение 2: счётчик + isset()

    В отличие от предыдущего варианта, мы не смотрим на количество элементов массива, а запускаем вечный цикл и в каждой итерации проверяем существование следующего элемента, и если его нет – прерываем цикл командой break:

    <?php
    $arr = [12, 4, 182, 1, 2.587];
    $min = null;
    $min_key = null;
    $max = null;
    $max_key = null;
    
    for($i = 0; true; $i++)
    {
    	if(!isset($arr[$i]))
    		break;
    
        if($arr[$i] > $max or $max === null)
        {
            $max = $arr[$i];
            $max_key = $i;
        }
    
        if($arr[$i] < $min or $min === null)
        {
            $min = $arr[$i];
            $min_key = $i;
        }
    }
    
    echo "Min value: $min <br> Min key: $min_key <br>";
    echo "Max value: $max <br> Max key: $max_key";

    Решение 3: each() + list()

    Функция each() возвращает массив с ключом и значением текущего элемента массива, а list() превращает этот массив в 2 разные переменные. После последнего элемента функция each() вернёт false и цикл прекратит работу.

    <?php
    $arr = [12, 4, 182, 1, 2.587];
    $min = null;
    $min_key = null;
    $max = null;
    $max_key = null;
    $i = 0;
    
    for(; list($k, $v) = each($arr);)
    {
        if($v > $max or $max === null)
        {
            $max = $v;
            $max_key = $k;
        }
    
        if($v < $min or $min === null)
        {
            $min = $v;
            $min_key = $k;
        }
    }
    
    echo "Min value: $min <br> Min key: $min_key <br>";
    echo "Max value: $max <br> Max key: $max_key";

    Решение 4: current() + next()

    С помощью функции next() смещаем внутренний указатель массива, а функции current() и key() возвращают текущие ключ и значение. Первое и последнее выражение цикла оставляем пустыми.

    <?php
    $arr = [12, 4, 182, 1, 2.587];
    $min = null;
    $min_key = null;
    $max = null;
    $max_key = null;
    $i = 0;
    
    for(; $v = current($arr);)
    {
    	if($v > $max or $max === null)
    	{
    		$max = $v;
    		$max_key = key($arr);
    	}
    
    	if($v < $min or $min === null)
    	{
    		$min = $v;
    		$min_key = key($arr);
    	}
    
    	next($arr);
    }
    
    echo "Min value: $min <br> Min key: $min_key <br>";
    echo "Max value: $max <br> Max key: $max_key";

    Максимальное значение в ассоциативном массиве

    В ассоциативных массивах отсутствует порядок или системность в названиях ключей, поэтому циклы со счётчиками здесь недоступны.

    Но мы всё ещё можем использовать цикл foreach и те решения для while и for, где используются функции each() и next(), поскольку они используют не ключи, а внутренний указатель массива.

    Добавить комментарий