Retorno de extremos de um gráfico, de acordo com a diferença entre pontos inserida pelo usuário

Salve galera,

Meu professor lançou um trabalho que consiste no retorno de extremos de um gráfico, de acordo com a diferença entre pontos inserida pelo usuário.

Os critérios são os seguintes:

1. Sempre manter o primeiro e o último valor da lista;
2. Dado o valor de R, se dois ou mais itens consecutivos da lista estão a uma distância menor ou igual a R, devem ser retirados da lista.

E deu alguns exemplos de entrada e saída de valores, vou colocar dois aqui:

  1. PARA R=2:
    [color=green]ENTRADA { -5; -15; 4; 2; 14; -1; 10; 8; 11; -22 }[/color]
    [color=blue]SAÍDA { -5; -15; 14; -1; 11; -22 }[/color]

  2. PARA R=3:
    [color=green]ENTRADA { 20; 11; 15; -2; 18; 9; 13; 6; 17; -2; 19; 16; 17; 12; 25; 23 }[/color]
    [color=blue]SAÍDA { 20; 11; 15; -2; 18; 6; 17; -2; 19; 12; 25; 23 }[/color]

Cheguei até o seguinte código:

//importa a classe JOptionPane
import javax.swing.JOptionPane;

//início do programa
public class Main
{ public static void main (String[] Args)
    {
        //pergunta ao usuário a quantidade de pontos do gráfico (para iniciar o vetor)
        int tam = Integer.parseInt(JOptionPane.showInputDialog("Digite a quantidade de pontos do gráfico. (Valor inteiro maior e do que 3)"));
        
        //condição para perguntar novamente caso o usuário peça uma quantidade de pontos menor ou igual a 3
        while (tam < 3)
            {
                tam = Integer.parseInt(JOptionPane.showInputDialog("Digite a quantidade de pontos do gráfico. (Valor inteiro e maior do que 3)"));
            }
        
        // inicia o vetor do gráfico e o vetor de resultados
        double grafico [] = new double [tam + 2];
        double resultado [] = new double [tam];
        
        //pergunta ao usuário cada ponto do gráfico para povoar o vetor
        int cont = 0;
        while (cont < tam)
            {
                grafico [cont] = Double.parseDouble(JOptionPane.showInputDialog("Digite o " + (cont + 1) + "° número do gráfico."));
                cont++;
            }
            
        //pergunta ao usuário o valor de R
        double R = Double.parseDouble(JOptionPane.showInputDialog("Digite o valor de R"));
            
        //condição para eliminar os números de acordo com o que o exercício pede e povoar o vetor de respostas
        cont = 1;
        int aux = 1;
        //tamRes = variável para descobrir quantas posições válidas o vetor resposta irá ter (inicia em dois pq a primeira e última posição mantém sempre a mesma, portanto não entram na condição abaixo)
        int tamRes = 2;
        while (cont < (tam - 1))
            {   //compara a posição atual do vetor grafico menos a próxima e identifica se é maior do que o R dado
                //Math.abs() = método para retornar o módulo do resultado. Exemplo: |-2| = |2| = 2
                if (Math.abs(grafico [cont] - grafico [cont+1]) > R)
                {
                    //caso a condição acima seja verdadeira o vetor resultado recebe a posição atual do vetor grafico, portanto, o número não é excluído da resposta
                    resultado [aux] = grafico [cont];
                    aux++;
                    tamRes++;
                } else 
                    {
                        //caso a condição acima seja falsa ele pula o número atual e o próximo número do gráfico, excluindo-os da resposta
                        cont++;
                    }
                //adiciona 1 ao contador
                cont++;
            }
        //a primeira e última posição mantém sempre a mesma
        resultado [0] = grafico [0];
        resultado [aux] = grafico [tam - 1];
        
        //prepara a resposta para exibir ao usuário
        String result = "";
        cont = 0;
        while (cont < tamRes)
            {
                result += " | " + resultado [cont];
                cont++;
            }
        
        //exibe a resposta ao usuário
        JOptionPane.showMessageDialog(null, result);
            
        //fim do programa
        System.exit(0);
    }
}

Ele dá certo para o exemplo 1, mas para o exemplo 2 tem algo que dá errado e que eu não consegui identificar no código, poderiam me ajudar?

Dica: Para ficar mais fácil de visualizar os exemplos, coloquem no excel e criem gráficos da entrada e saída de valores.

Muito Obrigado!

Olá,
acho que a resposta do segundo está errada.

{ 20; 11; 15; -2; 18; 9; 13; 6; 17; -2; 19; 16; 17; 12; 25; 23 }
{ 20; 11; 15; -2; 18;           6; 17; -2; 19;            12; 25; 23 }
Correta se a distância for o módulo da diferença. 25 e 23 são retirados pois |25-23|=2, que é menor que o R=3:
{ 20; 11; 15; -2; 18; 9; 13; 6; 17; -2; 19;            12;           }

concorda?

Att.

Já pensei nisso, mas não está. Tem algum erro de lógica que eu não estou conseguindo identificar.

Olá,
mas a distância entre 9 e 13 é 4. Se R=3 eles não seriam retirados.

{ 20; 11; 15; -2; 18; 9; 13; 6; 17; -2; 19; 16; 17; 12; 25; 23 }

Att.

Você tem toda razão, cara!

Tem alguns pontos errados no segundo exemplo, mas mesmo assim retorna valores que não deveriam retornar.

Porém eu já identifiquei o erro. O ‘if’ que compara o módulo do resto em relação a R deve ter mais uma condição. Ele tem que comparar a posição atual com a próxima e também a anterior. Entendeu?

Não estou no meu computador agora, mas assim que estiver posto o código finalizado para ajudar alguém que possa ter a mesma dúvida.

Uma dica que eu aceito é como otimizar o tempo de execução desse programa. Por exemplo, usar uma matriz seria melhor opção do que usar dois vetores? Ou em vez de usar a classe ‘Math’ para comparar o módulo, usar outro recurso, etc.

Valeu, amigo.

Como prometido, o resultado:

//importa a classe JOptionPane
import javax.swing.JOptionPane;

//início do programa
public class Main
{ public static void main (String[] Args)
    {
        //pergunta ao usuário a quantidade de pontos do gráfico (para iniciar o vetor)
        int tam = Integer.parseInt(JOptionPane.showInputDialog("Digite a quantidade de pontos do gráfico. (Valor inteiro maior e do que 3)"));
        
        //condição para perguntar novamente caso o usuário peça uma quantidade de pontos menor ou igual a 3
        while (tam < 3)
            {
                tam = Integer.parseInt(JOptionPane.showInputDialog("Digite a quantidade de pontos do gráfico. (Valor inteiro e maior do que 3)"));
            }
        
        // inicia o vetor do gráfico e o vetor de resultados
        double grafico [] = new double [tam];
        double resultado [] = new double [tam];
        
        //pergunta ao usuário cada ponto do gráfico para povoar o vetor
        int cont = 0;
        while (cont < tam)
            {
                grafico [cont] = Double.parseDouble(JOptionPane.showInputDialog("Digite o " + (cont + 1) + "° número do gráfico."));
                cont++;
            }
            
        //pergunta ao usuário o valor de R
        double R = Double.parseDouble(JOptionPane.showInputDialog("Digite o valor de R"));
            
        cont = 1;
        int aux = 1;
        //tamRes = variável para descobrir quantas posições válidas o vetor resposta irá ter (inicia em dois pq a primeira e última posição mantém sempre a mesma, portanto não entram na condição abaixo)
        int tamRes = 2;
        //condição para eliminar os números de acordo com o que o exercício pede e povoar o vetor de respostas
        while (cont <= (tam - 2))
            {   //compara a posição atual do vetor grafico menos a próxima e identifica se é maior do que o R dado
                //Math.abs() = método para retornar o módulo do resultado. Exemplo: |-2| = |2| = 2
                if ((Math.abs(grafico [cont] - grafico [cont - 1]) > R) && (Math.abs(grafico [cont] - grafico [cont + 1]) > R))
                {
                    //caso a condição acima seja verdadeira o vetor resultado recebe a posição atual do vetor grafico, portanto, o número não é excluído da resposta
                    resultado [aux] = grafico [cont];
                    aux++;
                    tamRes++;
                }
                //adiciona 1 ao contador
                cont++;
            }
        //a primeira e última posição mantém sempre a mesma
        resultado [0] = grafico [0];
        resultado [aux] = grafico [tam - 1];
        
        //prepara o vetor do gráfico original para exibir ao usuário
        String graf = "";
        for (cont = 0; cont < tam; cont++)
            {
                 graf += " | " + grafico [cont];
            }
        
        //prepara a resposta para exibir ao usuário
        String result = "";
        for (cont = 0; cont < tamRes; cont++)
            {
                 result += " | " + resultado [cont];
            }
                
        //exibe a resposta ao usuário
        JOptionPane.showMessageDialog(null, "Gráfico: " + graf + "\n" + "Para R = " + R + " \n" + "Resultado: " + result);
            
        //fim do programa
        System.exit(0);
    }
}