Array

Olá,

Estou a precisar da vossa ajuda, para o seguinte: Tenho um array com 20 numeros inteiros e queria q o programa me indicasse onde começa a primeira serie de numeros crescentes:

Por exemplo para este array de 14 numeros:

8 5 6 2 4 6 9 4 2 0 8 9 10 12, etc

A primeira serie crescente começa no indice 3 do array e vai até ao indice 6 (q sao os numeros 2 4 6 9) e a segunda começa no indice 9 e vai até ao 13 (numeros 0 8 9 10 12).

Eu queria obter como resultado a serie crescente mais longa, q neste caso seria a segunda q dei como exemplo( numeros 0 8 9 10 12).

Alguém me poderia ajudar?

Muito obrigado.

A primeira coisa que você precisa criar é um método que dado um array e uma posição inicial dentro do array, retorne o comprimento da sequência de números crescentes que começa nessa posição. Esse método pode retornar "1", por exemplo, se calhar de você ter uma sequência decrescente.

Por exemplo, digamos que você pegue o seu array original (8 5 6 2 4 6 9 4 2 0 8 9 10 12 ) e passe para esse método a posição "0".
Como você viu que na posição 1 a sequência já começa a decrescer, então ela lhe retorna "1".
Se você passar para esse método o valor "9", então esse método retorna o valor "5" (porque a sequência que ele vai achar tem 5 elementos: 0, 8, 9, 10 e 12).

A segunda coisa é ir percorrendo o array usando esse método que você acabou de criar. Vou dar um exemplo com o seu array:

int maxLength = 0
Posição 0 -> método(0) retornou 1 (porque é 8, 5, …). Então maxLength = 1
Posição 0 + retorno do método = 1 -> método(1) retorna 2 porque você tem a sequência 5, 6, 2…). Então maxLength = 2.
Posicao 1 + retorno = 3 -> método(3) retorna 4 porque você tem a seqüência 2, 4, 6, 9, 4…) Então maxLength = 4.
Posição 3 + retorno = 7 -> método(7) retorna 1 devido à sequência 4, 2…). maxLength continua em 4.

E por aí vai.

Não sei se era isso que você queria, mas ta aí o código de duas funções que fazem isto…
primeiro, eu considerei que um array válido tem no mínimo 3 elementos (pelo que eu entendi)… a primeira acho não está à prova de falhas (caso receba um caso onde não existe array crescente)

	int[] achaMaiorArrayA(int[] arr){
		int max = arr.length;
		int[][] arraysAchados = new int[max][max];
		int[] tamCadaArray = new int[max];
		int n=0, j=0;
		for(int i=0; i<arr.length; i++){
			arraysAchados[n][j] = arr[i];
			j++;
			if(arr[i+1]<arr[i]){
				if(j>2){
					tamCadaArray[n]=j;
					n++;
				}
				j=0;
			}
		}
		int indiceMaiorArray = 0;
		int temp = tamCadaArray[0];
		for(int i=1; i<n; i++){
			if(tamCadaArray[i]>temp){
				temp = tamCadaArray[i];
				indiceMaiorArray = i;
			}
		}
		return arraysAchados[indiceMaiorArray];
	} //fim da primeira função
	
	ArrayList<Integer> achaMaiorArrayB(int[] arr){
		ArrayList<ArrayList<Integer>> arraysAchados = new ArrayList<ArrayList<Integer>>();
		ArrayList<Integer> arrTemp = new ArrayList<Integer>();
		for(int i=0; i<arr.length; i++){
			arrTemp.add(arr[i]);
			if(arr[i+1]<arr[i]){
				if(arrTemp.size()>2){
					arraysAchados.add(arrTemp);
				}
				arrTemp = new ArrayList<Integer>();
			}
		}
		int indiceMaiorArray = 0;
		int maiorTamanho = 0;
		for(int i=0; i<arraysAchados.size(); i++){
			if(arraysAchados.size()>maiorTamanho){
				indiceMaiorArray = i;
			}
		}
		if(arraysAchados.size() == 0)
			return null;
		else
			return arraysAchados.get(indiceMaiorArray);
	}//fim da segunda função

Oi,

Obrigado pelas respostas.

Aqui vai o que consegui até agora, mas ainda não funciona. Quando executo ele diz que o indice onde começa a maior série de numeros por ordem crescente é 1. Alguém me pode dizer o que não está bem? Obrigado

public static void maiorSerie()
	{
		int [] tab1= {1, 0, 4, 2, 9, 3, 2, 4, 8};

		int indice = 0;                        // inicio seq
		int maiorComp = 0;                     // num de numeros seq	
		int compAct = 1;                       // comprimento actual

		for(int i = 1; i < tab1.length; i++) // ciclo 1 .. max-1
		{ 
			if(tab1[++i] > tab1[i]) // num seg > num actual
			{              
				compAct++;                         // incrementa comp Actual
			}
			else  // se não (quebra na seq)
			{                               
				if(compAct > maiorComp) // se o novo com > que o maior
				{           
					maiorComp = compAct;            // actualiza o Maior comp
					indice = i - maiorComp;         // inicio da sequencia
				}
				compAct = 1;                       // reinicia compAct
			}
			
		}
		if(compAct > maiorComp)  // verificar de novo
		{              
			maiorComp = compAct;                 // actualiza o Maior comp
			indice =  tab1.length - maiorComp;  // inicio da sequencia
		}
		
		System.out.println("Posição onde começa a maior série de números por ordem crescente é: " +indice);
	}
		

Cara, vê se dá para você se orientar por aqui:


public class Main {

	public static void main(String[] args) {
		int [] sequencia = {8, 5, 6, 2, 4, 6, 9, 4, 2 ,0 ,8 ,9 ,10, 12};
		int iu = 0;
		int i = 0;
		int maiorSize = 0;
		int inicioMaiorSequencia = 0;
		int fimMaiorSequencia = 0;
		StringBuilder sb = new StringBuilder();
		
		while(iu <= sequencia.length-1){
			int primeiro = sequencia[i];
			int proximo = sequencia[i+1];
			while(primeiro < proximo){
				iu++;
				primeiro = proximo;
				if (iu < sequencia.length-1)
					proximo = sequencia[iu + 1];				
			}
			sb.append("Sequencia >> size:").append(( iu-i +1)).append(" ; ");
			sb.append("indices:[").append(i);
			if (i!= iu)
				sb.append("-"+ iu);
			sb.append("]\n");
			
			if (maiorSize < iu-i){
				maiorSize = iu-i;
				inicioMaiorSequencia = i;
				fimMaiorSequencia = iu;
			}
			iu++;
			i=iu;
		}
		
		sb.append("\nMaior Sequencia >> ");
		sb.append("size:").append((fimMaiorSequencia- inicioMaiorSequencia + 1)).append(" ; ");
		sb.append("indices:[").append(inicioMaiorSequencia);
		if (inicioMaiorSequencia!= fimMaiorSequencia)
			sb.append("-"+ fimMaiorSequencia);
		sb.append("]\n");
		System.out.println(sb.toString());
		
	}

}

primeiro: nesta parte do código:

[quote] for(int i = 1; i < tab1.length; i++) // ciclo 1 .. max-1 if(tab1[++i] > tab1[i]) // num seg > num actual { compAct++; // incrementa comp Actual } [/quote]
você incrementa o i em tab1[++i] > tab1[i], logo teremos algumas repetições do loop for onde o i será incrementado duas vezes (uma no loop for, outra na condição do if). Você deveria escrever:

...
if(tab1[i+1] > tab1[i])
...

o comando i++ ou ++i por si só equivale a i = i+1 (ou i += 1), e não simplesmente i+1.

Outra coisa que não entendi… porque começar o loop

...
 for(int i = 1; i < tab1.length; i++)
...

com i=1? assim você não estará comparando o primeiro e o segundo termo, começará comparando do segundo e terceiro. (lembre-se que os índices do vetor vet[n] começa do 0 e vai até vet[n-1])

pelo que eu vi é isso