Как найти максимальный элемент матрицы java

Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Like Article

    Given a multi-dimensional 2D matrix of n rows and m column order N × M. The task is to find the maximum element in the given matrix.

    Illustration:

    Input  : mat[][] = { {1,3,4,19}, {11,10,12,1}, {7,9,0,4,99} }
    Output : 99

    Methods:

    1. Iterative method (naive approach)
    2. Using the principle of recursion (Bit more optimal approach)

    Method 1: Iterative method 

    The approach is simple to iterate every element of the matrix one by one and store the maximum of two elements in the max variable as used below in the program and returns the max variable that contains the maximum element of the matrix.

    Example 

    Java

    import java.io.*;

    class GFG {

        static int max(int mat[][])

        {

            int max = 0;

            for (int i = 0; i < mat.length; ++i) {

                for (int j = 0; j < mat[0].length; ++j) {

                    max = Math.max(mat[i][j], max);

                }

            }

            return max;

        }

        public static void main(String[] args)

        {

            int mat[][] = { { 1, 3, 4, 19 },

                            { 11, 10, 12, 1 },

                            { 7, 9, 0, 99 } };

            int max_element = max(mat);

            System.out.println(max_element);

        }

    }

    Time Complexity: O(n2)

    Auxiliary Space: O(1)

    Method 2: Using the principle of recursion 

    Procedure:

    • Recursively call every element of the matrix to the last element of the matrix.
    • Return the max of the current element to the next recursive call element.

    Example

    Java

    import java.io.*;

    class GFG {

        static int max(int mat[][], int i, int j)

        {

            if (j == mat[0].length && i < mat.length) {

                j = 0;

                ++i;

            }

            if (i == mat.length) {

                return 0;

            }

            return Math.max(mat[i][j], max(mat, i, j + 1));

        }

        public static void main(String[] args)

        {

            int mat[][] = { { 1, 3, 4, 19 },

                            { 11, 10, 12, 1 },

                            { 7, 9, 0, 99 } };

            int max_element = max(mat, 0, 0);

            System.out.println(max_element);

        }

    }

    Time Complexity: O(n)

    Auxiliary Space: O(n)

    Last Updated :
    28 Jul, 2022

    Like Article

    Save Article

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

    package untitled;
    
    import java.io.*;
    
    public class Main{
        public static void main(String[] args)
                throws java.io.IOException {
            int n = 5, max = 0, m = 6, maxb = 0, nn = 3, cn = 8;
            int[] a = new int[n]; //создание одномерного массива
            System.out.println("Одномерный массив:");
            for (int i = 0; i < a.length; i++) { //заполнение массива случайными числами в интервале [-7; 5]
                a[i] = (int) Math.round((Math.random() * 13) - 7);
                System.out.print(a[i] + "  ");
            }
            for (int i = 0; i < a.length; i++) {
                if (max < a[i]){
                    max = a[i];
                }
            }
            System.out.println(" ");
            System.out.println("Максимальный элемент одномерного массива " + max);
            int[][] b = new int[n][m];
            System.out.println("Двумерный массив:");
            for (int i = 0; i < b.length; i++) {
                for(int j = 0; j < b[i].length; j++) {
                    b[i][j] = a[i] >> j;
                    System.out.format("%4d", b[i][j]);
                }
                System.out.println();
            }
    
            for (int i = 0; i < b.length; i++) {
                for(int j = 0; j < b[i].length; j++) {
                    if (maxb < b[i][j]){
                        maxb = b[i][j];
                    }
                }
            }
            System.out.println("Максимальный элемент двумерного массива " + maxb);
    
            int c [][] = new int[nn][cn];
            System.out.println("Нерегулярный массив:");
            for(int i = 0; i < c.length; i++){
                for(int j = 0; j < c[i].length; j++){
                    c[i][j] = 3 * i + j + maxb;
                    System.out.format("%4d", c[i][j]);
                }
                System.out.println();
            }
        }
    }
    

    Результат получился в виде:

    Одномерный массив:
    -1  -5  1  6  2   
    Максимальный элемент одномерного массива 6
    Двумерный массив:
      -1  -1  -1  -1  -1  -1
      -5  -3  -2  -1  -1  -1
       1   0   0   0   0   0
       6   3   1   0   0   0
       2   1   0   0   0   0
    Максимальный элемент двумерного массива 6
    Нерегулярный массив:
       6   7   8   9  10  11  12  13
       9  10  11  12  13  14  15  16
      12  13  14  15  16  17  18  19
    

    UPDATE

    Проблема была с следующем фрагменте кода

        for(int i = 0; i<b.length; i++){
            for(int j = 0; j<b[i].length; j++){
                if (b[i][maxb] < b[i][j]){
                    maxb=j;
                }
            }
        }
    

    А именно была допущена ошибка в условии if (b[i][maxb] < b[i][j]) и действии выполняемом при условии. Исходя из поставленной задачи данных циклов, а именно поиск максимального значения элемента двумерного массива, необходимо определить, какое число будет больше от исходного maxb=0; для использования в следующих циклах. В следствии допущенной ошибки в условии переменная maxb оставалась всегда равной нулю, что приводило к дальнейшей ошибке выполнения алгоритма.

    Проблему решил исправив условие в данном фрагменте кода, а так же действии выполняемом в случае истинности условия.

            for (int i = 0; i < b.length; i++) {
                for(int j = 0; j < b[i].length; j++) {
                    if (maxb < b[i][j]){
                        maxb = b[i][j];
                    }
                }
            }
            System.out.println("Максимальный элемент двумерного массива " + maxb);
    

    На данном фрагменте мы сравниваем значение переменной maxb со значением элемента двумерного массива. Если значение maxb меньше значения элемента массива, тогда в переменную maxb присваивается это значение элемента.

    Ввести с консоли n – размерность матрицы a [n] [n]. Задать значения элементов матрицы в интервале значений от -M до M с помощью генератора случайных чисел (класс Random).
    Найти максимальный элемент в матрице и удалить из матрицы все строки и столбцы, его содержащие.

    Ответы (1 шт):

    import java.util.ArrayList;
    import java.util.Random;
    import java.util.Scanner;
    
    public class Main {
    
        public static void main(String[] args) {
            // Создаем сканер
            Scanner s = new Scanner(System.in);
            // Пытаемся считать n, ессли ввели не число - завершаем программу
            int n;
            try {
                n = Integer.valueOf(s.nextLine());
            } catch (NumberFormatException e) {
                return;
            }
            // Пытаемся считать m, ессли ввели не число - завершаем программу
            int m;
            try {
                m = Integer.valueOf(s.nextLine());
            } catch (NumberFormatException e) {
                return;
            }
            // Создаем массив
            int[][] arr = new int[n][n];
            Random random = new Random();
            
            int max = -m;
    
            ArrayList<Integer> rows = new ArrayList<Integer>();
            ArrayList<Integer> column = new ArrayList<Integer>();
            
            for (int i = 0; i < arr.length; i++) {
                // Случайные числа
                arr[i] = random.ints(n, -m, m).toArray();
                // Сразу ищем максимальное
                for (int j = 0; j < arr.length; j++) {
                    if(arr[i][j] > max) {
                        max = arr[i][j];
                    }
                    System.out.print(arr[i][j] + " ");
                }
                System.out.println();
            }
            // Поиск колонок и столбцов, которые надо удалить
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    if(max == arr[i][j]) {
                        if(rows.indexOf(j) == -1)
                            rows.add(j);
                        if(column.indexOf(i) == -1)
                            column.add(i);
                    }
                }
            }
            
            System.out.println("nMax: " + max);
            
            int[][] newArr = new int[n - rows.size()][n - column.size()];
            System.out.println("Size: " + (n - rows.size()) + "x" + (n - column.size()));
    
            int newArrI = 0;
            int newArrJ = 0;
            // СЗаполняем новый массив без столбцов и строк с мах числом
            for (int i = 0; i < n; i++) {
                if(rows.indexOf(i) == -1) {
                    newArrJ = 0;
                    for (int j = 0; j < n; j++) {
                        if(column.indexOf(j) == -1) {
                                newArr[newArrI][newArrJ] 
                                        = arr[j][i];
                                newArrJ++;
                        }
                    }
                    newArrI++;
                }
            }
    
            // Печать результатата
            for (int i = 0; i < newArr.length; i++) {
                for (int j = 0; j < newArr[i].length; j++) {
                    System.out.println();
                    System.out.print(newArr[i][j] + " ");
                }
            }
        }
    }
    

    → Ссылка

    Часто сталкиваюсь с проблемой понимания кода, вернее его написания. Когда вроде бы читаешь и понимаешь какая строка что делает, а сам такое повторить почему то не можешь. Но проблемы проблемами, а задачи нужно решать, и так
    Дан двумерный массив размером 5х6, заполненный случайным образом. Заменить максимальный элемент каждой строки на противоположный. Написал что-то вроде этого

    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int m,n,i,j;
    System.out.print("Введите количество строк = ");
    m = in.nextInt();
    System.out.print("Введите количество столбцов = ");
    n = in.nextInt();
    int[][] mass = new int[m][n]; // создание массива
    for (i=0;i<m;i++) {
    for (j=0;j<n;j++) {
    mass [i][j]=(int) (Math.random()*(20)+1);}}
    for (i=0;i<n;i++){
    for (j=0;j<n;j++){
    System.out.printf("%d ",mass[i][j]);
    }
    System.out.println(""); // его заполнение и вывод
    }
    int max, maxi = 0;
    for(i=0;i<n;i++) {
    max = mass[i][0];
    if (mass[i][0]>=max){
    max = mass[i][0];
    maxi=i; // тут постарался найти максимальный элемент чтобы в будущем заменить
    }
    }
    }
    }

    Далее, как я понимаю, нужно найти еще и минимальный элемент, чтобы в будущем maxi заменить на mini, но как это сделать?(К сожалению сейчас не могу попробовать тк нет под рукой нетбинса)
    может примерно так?

    int min, mini = 0;
    for(i=0;i<n;i++) {
    min = mass[i][0];
    if (mass[i][0]<=min) {
    min = mass[i][0];
    mini = i;

    и потом просто max = min? а вывести это как?
    Заранее спасибо за ответ, и просто тем, кто прочел эту гору текста

    В этом посте будет обсуждаться, как найти минимальный и максимальный элемент в массиве в Java.

    1. Использование списка

    Если данный массив не является примитивным массивом, мы можем использовать Arrays.asList() который возвращает список, поддерживаемый массивом. Затем мы вызываем min() а также max() методы Collections class для получения минимального и максимального элементов соответственно. Обратите внимание, что при этом не выполняется фактическое копирование элементов массива.

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    import java.util.Arrays;

    import java.util.Collections;

    import java.util.List;

    class Main

    {

        public static void main(String[] args)

        {

            // не примитивный целочисленный массив

            Integer[] A = { 6, 8, 3, 5, 1, 9 };

            List<Integer> ints = Arrays.asList(A);

            System.out.println(“Min element is “ + Collections.min(ints));

            System.out.println(“Max element is “ + Collections.max(ints));

        }

    }

    Скачать  Выполнить код

     
    Для примитивных массивов мы можем использовать Java 8 Stream для преобразования массива в список.

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    import java.util.Arrays;

    import java.util.Collections;

    import java.util.List;

    import java.util.stream.Collectors;

    class Main

    {

        public static void main(String[] args)

        {

            // примитивный целочисленный массив

            int[] A = { 6, 8, 3, 5, 1, 9 };

            List<Integer> ints = Arrays.stream(A)

                                    .boxed()

                                    .collect(Collectors.toList());

            System.out.println(“Min element is “ + Collections.min(ints));

            System.out.println(“Max element is “ + Collections.max(ints));

        }

    }

    Скачать  Выполнить код

    2. Использование библиотеки Guava

    В библиотеке Guava есть Ints, Doubles, Chars, Longsи т. д., классы, предлагающие несколько статических служебных методов, относящихся к примитивам, которых еще нет ни в одном из них. Integer или же Arrays учебный класс. Чтобы найти минимальный и максимальный элемент, мы можем использовать min() а также max() методы соответствующего класса.

    import com.google.common.primitives.Ints;

    class Main

    {

        public static void main(String[] args)

        {

            int[] A = { 6, 8, 3, 5, 1, 9 };

            System.out.println(“Min element is “ + Ints.min(A));

            System.out.println(“Max element is “ + Ints.max(A));

        }

    }

    Скачать код

    3. Использование потока Java 8

    С появлением Stream в Java 8 мы можем преобразовать массив в поток соответствующего типа, используя метод Arrays.stream() метод. Тогда мы можем вызвать max() а также min() метод, который возвращает максимальный и минимальный элемент этого потока как OptionalInt.

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    import java.util.Arrays;

    class Main

    {

        public static void main(String[] args)

        {

            int[] A = { 6, 8, 3, 5, 1, 9 };

            int max = Arrays.stream(A)

                            .max()

                            .getAsInt();

            int min = Arrays.stream(A)

                            .min()

                            .getAsInt();

            System.out.println(“Min element is “ + min);

            System.out.println(“Max element is “ + max);

        }

    }

    Скачать  Выполнить код

     
    Мы также можем получить поток без использования Arrays.stream() метод, как показано ниже. Здесь идея состоит в том, чтобы получить поток индексов массива и сопоставить каждый индекс с соответствующим элементом в массиве.

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    import java.util.stream.IntStream;

    class Main

    {

        public static void main(String[] args)

        {

            int[] A = { 6, 8, 3, 5, 1, 9 };

            int max = IntStream.range(0, A.length)

                            .map(i -> A[i])

                            .max()

                            .getAsInt();

            int min = IntStream.range(0, A.length)

                            .map(i -> A[i])

                            .min()

                            .getAsInt();

            System.out.println(“Min element is “ + min);

            System.out.println(“Max element is “ + max);

        }

    }

    Скачать  Выполнить код

     
    Наконец, мы можем назвать summaryStatistics() метод для потока числовых значений, который возвращает IntSummaryStatistics описывающие различные сводные данные об элементах этого потока. Чтобы получить минимальный и максимальный элемент, вызовите getMin() а также getMax() методы на нем.

    import java.util.Arrays;

    import java.util.IntSummaryStatistics;

    class Main

    {

        public static void main(String[] args)

        {

            int[] A = { 6, 8, 3, 5, 1, 9 };

            IntSummaryStatistics stats = Arrays.stream(A).summaryStatistics();

            System.out.println(“Min element is “ + stats.getMin());

            System.out.println(“Max element is “ + stats.getMax());

        }

    }

    Скачать  Выполнить код

     
    Это эквивалентно:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    import java.util.IntSummaryStatistics;

    class Main

    {

        public static void main(String[] args)

        {

            int[] A = { 6, 8, 3, 5, 1, 9 };

            IntSummaryStatistics stats = new IntSummaryStatistics();

            for (int i : A) {

                stats.accept(i);

            }

            System.out.println(“Min element is “ + stats.getMin());

            System.out.println(“Max element is “ + stats.getMax());

        }

    }

    Скачать  Выполнить код

    4. Напишите свой собственный служебный метод

    Мы также можем написать нашу собственную процедуру для поиска минимального и максимального элемента в массиве, как показано ниже:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    class Main

    {

        private static int getMax(int[] A)

        {

            int max = Integer.MIN_VALUE;

            for (int i: A) {

                max = Math.max(max, i);

            }

            return max;

        }

        private static int getMin(int[] A)

        {

            int min = Integer.MAX_VALUE;

            for (int i: A) {

                min = Math.min(min, i);

            }

            return min;

        }

        public static void main(String[] args)

        {

            int[] A = { 6, 8, 3, 5, 1, 9 };

            System.out.println(“Min element is “ + getMin(A));

            System.out.println(“Max element is “ + getMax(A));

        }

    }

    Скачать  Выполнить код

    5. Использование сортировки

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

    import java.util.Arrays;

    class Main

    {

        public static void main(String[] args)

        {

            int[] A = { 6, 8, 3, 5, 1, 9 };

            Arrays.sort(A);

            System.out.println(“Min element is “ + A[0]);

            System.out.println(“Max element is “ + A[A.length 1]);

        }

    }

    Скачать  Выполнить код

    Это все о поиске минимального и максимального элементов в массиве в Java.

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