Duvida com matrizes

Boa noite pessoa!

Estou com um trabalho aqui e estou com dificuldades para conseguir construir a logica.

O problema consiste em analisar uma matriz (que pode ser quadrada ou não) e retornar qual a maior sequencia (quantidade de elementos )que existe dentro dela.

Por exemplo.

Na matriz :
3 2 1
4 6 9
11 8 7

A maior sequencia de elementos é: 1,2,3,4

Neste outro exemplo seria:

20 21 22
16 17 23
15 25 24

A maior sequencia seria: 20, 21, 22 ,23, 24, 25

Minha duvida está sendo, que ao tentar ler e comparar as posições. eu não consigo comparar a posição ao lado e a de baixo ao mesmo tempo. Sem contar que no final da linha, o programa tenta ler uma posição que não existe na matriz.

Se puderem ajudar serei grato.

public static void main(String[] args) {
	
	
	int m[][]  = new int [][] {{3,2,1},
		   					   {4,6,9},
		   					   {11,8,7}};
		   					   
	ArrayList<Integer> sequencia = new ArrayList<>();   	
			
	
	
	for (int i = 0; i < m.length; i++) {
		for (int j = 0; j < m.length; j ++) {
			
				if(m[i][j]+1 == m[i][j+1] ){   
					sequencia.add(m[i][j]);
					}
			}
				
	}
	for (Integer integer : sequencia) {
		System.out.println(integer);
		}

}	
}

Ao realizar esse codigo, retorna esse erro:

Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at Test/application.Program.main(Program.java:26)

@lm.pardini Olá! Tudo bem? :slightly_smiling_face:

A lógica que você precisa fazer para resolver esse exercício necessita que você compare um valor da matriz com todos os outros, não apenas com o próximo registro na sequencia. Para isso você precisa fazer um novo loop percorrendo toda a matriz e comparando com o registro atual.

Veja no código abaixo uma forma de resolver esse desafio:

public static void main(String[] args) {

int m[][] = new int[][] { { 20, 21, 22 }, { 16, 17, 23 }, { 15, 25, 24 } };

ArrayList<Integer> sequenciaTemporaria = new ArrayList<>();
ArrayList<Integer> sequenciaFinal = new ArrayList<>();

for (int i = 0; i < m.length; i++) {
  for (int j = 0; j < m.length; j++) {
    
    sequenciaTemporaria = new ArrayList<>();
    int numeroMatriz = m[i][j];
    
    int k = 0;
    while(k < m.length) {
      int l = 0;
      while(l < m.length) {
        if (m[k][l] == numeroMatriz +1) {
          if(!sequenciaTemporaria.contains(numeroMatriz))
            sequenciaTemporaria.add(numeroMatriz);
          sequenciaTemporaria.add(m[k][l]);
          numeroMatriz++;
          k = -1; 
          break;
        }
        l++;
      }
      k++;
    }
    
    if(sequenciaTemporaria.size() > sequenciaFinal.size())
      sequenciaFinal = sequenciaTemporaria;
   
  }
}

for (Integer integer : sequenciaFinal) {
  System.out.println(integer);
}}

Fiz o teste com as duas sequências de exemplo e funcionou!

Boa sorte e bons estudos! :grinning:

2 curtidas

Testei aqui e deu certo! Obrigado pela ajuda.

Mas ficou duvidas que não consegui entender.

Por que definir k = -1?

Oi @lm.pardini

:thinking:

O “k = -1” ocorre porque ao encontrar o registro sucessor eu adiciono na lista, paro o loop e desejo que ele recomece a percorrer a matriz desde a primeira linha. Como há a iteração “k++”, no final a variável K voltará a ser k=0, reiniciando o loop. Fiz dessa forma para que não fosse necessário adicionar mais uma variável do tipo boolean para saber se encontrou ou não na matriz (para decidir se deve reiniciar a contagem ou não). :sunglasses:

Valeu! :slightly_smiling_face:

1 curtida