Найти специальные элементы в матрице m * n

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

static void findSpecialElement(int[][] matrix)  
{  
    for (int i = 0; i < matrix.length; i++)  
    {  
        int rowMin = matrix[i][0];               
        int colIndex = 0;           
        boolean specialElement = true;

        for (int j = 1; j < matrix[i].length; j++)
        {
            if (matrix[i][j] < rowMin)
            {
                rowMin = matrix[i][j];                     
                colIndex = j;
            }
        } 
        for (int j = 0; j < matrix.length; j++)
        {
            if (matrix[j][colIndex] > rowMin)
            {
                specialElement = false;                     
                break;
            }
        }

        if (specialElement)
        {
            System.out.println("Special Element is : "+rowMin);
        }
    }
}

Например: учитывая матрицу размером 3 * 3, элементы хранятся следующим образом

1  3  4
5  2  9
8  7  6

Ожидаемый результат - 7

Оставив 5 и 3 все остальные числа в матрице имеют либо мин., либо макс. в строке и столбце, поэтому 7 из 9 номеров имеет минимальные или максимальные значения.

Тогда 7 - это выход

Пожалуйста, возврат -1, если любая строка или любой столбец имеет элементы кратный минимум или максимум ...

Мой ошибка - это провал, чтобы получить ожидаемый ответ 7 как на или вопрос.

Вы не только бросили здесь домашнее задание, не продемонстрировав никаких попыток, но и даже не опубликовали вопрос полностью. Пожалуйста, пройдите stackoverflow.com/help/how-to-ask

Guy 03.10.2018 15:25

@ Guy Извините, я пытался много раз, но выход не удался ..

lancerfree 03.10.2018 15:30

@lancerfree, но вы не показали нам свои попытки и свои ошибки, как вы можете узнать, если вы не исправляете свои ошибки ?. Мы будем рады помочь вам исправить эти ошибки. Пожалуйста, отредактируйте свой вопрос и добавьте свой код и ошибку.

Rafael Palomino 03.10.2018 15:35

@RafaelPalomino Спасибо за предложение ... Я отредактировал вопрос .. Если возможно, попробуйте мне помочь ..

lancerfree 03.10.2018 15:54

@lancerfree На данный момент отсутствует одна из круглых скобок '}', поэтому он не будет компилироваться. Кроме того, плохая идентификация затрудняет задачу понять, как вы пытаетесь выполнять свою функцию. Pd: Я посмотрю, чем могу помочь вам на работе.

Rafael Palomino 03.10.2018 16:02

@ Рафаэль Паломино. Спасибо за мою ошибку и за вашу помощь ...

lancerfree 03.10.2018 16:13

@ Парень, надеюсь, теперь ты правильно понял мой вопрос

lancerfree 04.10.2018 09:06

@lancerfree Я не знаю, почему на выходе должно быть 7.

Guy 04.10.2018 09:31

@Guy В моем примере с матрицей 3 * 3, оставляющей 5 и 3, все остальные числа имеют минимальное и максимальное значение в строке и столбце, как я уже упоминал. Итак, всего 9 из 7 чисел имеют минимальное и максимальное значение в строке и столбце. 5 и 3 числа, у него нет ни min, ни max в строке и столбце. Итак, ожидаемый результат - 7. Вам нужно найти числа в матрице, которые имеют минимальное и максимальное значение в строке и столбце ..... Надеюсь, вы теперь поняли.

lancerfree 04.10.2018 09:41

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

lancerfree 04.10.2018 09:43

@ user3181365 Надеюсь, вы знаете ответ на мой вопрос ..

lancerfree 04.10.2018 09:43

@RafaelPalomino Получили ли вы что-нибудь на своем рабочем месте ... Пожалуйста, помогите мне ... Я также стараюсь изо всех сил, чтобы получить правильный результат в соответствии с вопросом ..

lancerfree 04.10.2018 15:58

@ 200_success вы можете помочь мне в решении этого вопроса ..

lancerfree 04.10.2018 16:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
13
3 218
4

Ответы 4

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

  • Вы проверяете минимум в столбце и строке (в обоих одновременно)
  • Вы не проверяете максимум
  • Вы печатаете найденный номер

Итак, ваша стратегия должна быть примерно такой:

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

Это должно вам помочь.

Отлично, вы точно поняли мой вопрос ... Я пробовал ваш способ, но все еще не могу получить результат 7 ... Не могли бы вы предоставить мне фрагмент кода ...

lancerfree 04.10.2018 20:10
int maxNum = matrix[0][0];   int minNum = matrix[0][0];

for (int i = 0; i < matrix.length; i++) {
    for (int j = 0; j < matrix[i].length; j++) {
        if (maxNum < matrix[i][j]){
        maxNum = matrix[i][j];
    }
    else if (minNum > matrix[i][j]) {
        minNum = matrix[i][j];
    }    
  }   
}

Вероятно, вы ищете это-

#include <bits/stdc++.h>

using namespace std;

string ltrim(const string &);
string rtrim(const string &);
vector<string> split(const string &);


// Complete the countSpecialElements function below.
int countSpecialElements(vector<vector<int>> matrix) {

int m = matrix.size();          //rows
int n = matrix[0].size();       //columns



int maxrow[102] , minrow[102];
int maxcol[102], mincol[102];
for(int p=0;p<102;p++){
    maxrow[p] =0 ;
    maxcol[p] = 0;
    minrow[p]=0;
    mincol[p]=0;
}

int k=0;
int i,j;

for(i=0;i<m;i++){
    int rminn = INT_MAX;
    int rmaxx = INT_MIN;
    for(j=0;j<n;j++){
        if (matrix[i][j]==rmaxx || matrix[i][j]==rminn) return -1;
        if (matrix[i][j] > rmaxx ) rmaxx = matrix[i][j];
        if (matrix[i][j] < rminn) rminn = matrix[i][j];
    }
    maxrow[i] = rmaxx;
    minrow[i] = rminn;

    for(j=0;j<n;j++){
        int cminn = INT_MAX;
        int cmaxx = INT_MIN;
        for(int p=0;p<m;p++){
            if (matrix[p][j]== cmaxx || matrix[p][j] == cminn) return -1;
            if (matrix[p][j] > cmaxx ) cmaxx = matrix[p][j];
            if (matrix[p][j] < cminn) cminn = matrix[p][j];
        }

        maxcol[j] = cmaxx;
        mincol[j] = cminn;
    }
}

    int cnt = 0;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            if ((matrix[i][j]== maxrow[i])||(matrix[i][j]==minrow[i])||(matrix[i][j]==maxcol[j])||(matrix[i][j]==mincol[j]))
                cnt++;
        }
    }
    return cnt;
}

Я думаю, что это можно сделать лучше = быстрее, но мой O(n^2):

import java.util.HashSet;
import java.util.Set;

public class Main {
    public static int[][] input = {
            {1, 3, 4},
            {5, 2, 9},
            {8, 7, 6}
    };

    public static void main(String[] args) {
        int numberOfElements = 0;
        Set<Integer> numberOfUniqueElements = new HashSet<>();

        Set<Integer> specialElements = new HashSet<Integer>();
        for (int i = 0; i < input.length; i++) {
            int maxInRow = Integer.MIN_VALUE;
            int minInRow = Integer.MAX_VALUE;
            int maxInColumn = Integer.MIN_VALUE;
            int minInColumn = Integer.MAX_VALUE;
            for (int j = 0; j < input[i].length; j++) {
                numberOfElements++;
                numberOfUniqueElements.add(input[i][j]);
                if (input[i][j] > maxInRow) {
                    maxInRow = input[i][j];
                }
                if (input[i][j] < minInRow) {
                    minInRow = input[i][j];
                }
                if (input[j][i] > maxInColumn) {
                    maxInColumn = input[j][i];
                }
                if (input[j][i] < minInColumn) {
                    minInColumn = input[j][i];
                }
            }

            specialElements.add(minInRow);
            specialElements.add(maxInRow);
            specialElements.add(minInColumn);
            specialElements.add(maxInColumn);
        }
        if (numberOfUniqueElements.size() != numberOfElements) {
            System.out.println("-1");
        } else {
            System.out.println(specialElements.size());
        }
    }
}

Другие вопросы по теме