Improve Article
Save Article
Like Article
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:
- Iterative method (naive approach)
- 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.