Wyszukiwanie i usuwanie lokalnych wartości maksymalnych JAVA

0

Cześć mam pewne zadanie do wykonania:
Wyszukaj w tablicy lokalnych wartości maksymalnych i je usuń.
Przykładowa tablica:

array = new int[]{-3, 2, 4, 13, 5, 12, 8};

i tablica, której będziemy oczekiwali na wyjściu:

expected = new int[]{-3, 2, 4, 5, 8};

I pomysł mam na to taki:
Wskoczyć na pierwszy element tablicy (2) i porównywać go z wcześniejszym, jeżeli jest większy to okej sprawdzamy z następnym i jeżeli jest większy od następnego to go usuwamy. Sprawdzamy z następnym i tak do końca tablicy. Tylko nie potrafię tego napisać.

import java.util.Arrays;
public class LocalMaximaRemove {
    public static void main(String[] args) {
        int[] array = new int[]{18, 1, 3, 6, 7, -5};
        System.out.println(Arrays.toString(removeLocalMaxima(array)));
    }
    public static int[] removeLocalMaxima(int[] array){
        int j, n;
        int start = array[0];
        int max = array[1];
        int[] result = new int[]{};
        int temp = array[n - 1];
        for (int i = 1; i < array.length; i++) {
            result = array[i - 1];
        }
        return result;
    }
}
1

Zacznij od tego ifa, którego opisałeś, bo na razie w Twoim programie nie ma żadnych porównań ani warunków. Potem już sobie dobierzesz indeksy tak, żeby nie wybuchało

0

Próbuję w ten sposób jednak nie wiem jak sobie poradzić z 0 pozycją tablicy bo w ifach zaczynam sprawdzać od 1 elementu. Dodatkowo pojawia się problem na końcu tablicy bo próbuję sprawdzić element spoza tablicy:

import java.util.Arrays;
public class LocalMaximaRemove {
    public static void main(String[] args) {
        int[] array = new int[]{3, 2, 3, 14, 13, 15};
        System.out.println(Arrays.toString(removeLocalMaxima(array)));
    }
    public static int[] removeLocalMaxima(int[] array){
        int start = array[0];
        int length = array.length;
        int[] result = new int[length];
        
        if(start > array[1]){             //sprawdzam zerowy element
                result[0] = array[1];
            }
        for (int i = 1; i < length -1; i++) { 
            if (array[i] > array[i-1]){
                if (array[i] < array[i+1]){
                    result[i] = array[i];
                }
                else if(array[i] > array[i+1]){
                    result[i] = array[i+1];
                }
            }
        }
        return result;
    }
}

Wynik kompilacji:

[2, 0, 3, 13, 0, 0]

Oczekiwany wynik, który chciałbym uzyskać:
[2,3,14,15]

1

Na pewno powinieneś używać tego samego indeksu i do wypełniania tablicy results? :) Przecież tam będziesz miał mniej elementów niż w tablicy wejściowej. Najpierw spróbuj sobie odpalić swój algorytm „na kartce”, sprawdź czy w ogóle ma prawo działać i warto to kodować.

0

Można korzystać z narzędzi:
Math.max();
ale oczywiście własne rozwiązanie bardziej rozwija.🙃

0

Co to jest "lokalne maksimum"? Czy to pojedyncza wartość, czy np. dla ciągu: {1,3,4,3,2} powinno wyciąć 3,4,3 i dać rezultat {1,2}?

0
wartek01 napisał(a):

Co to jest "lokalne maksimum"? Czy to pojedyncza wartość, czy np. dla ciągu: {1,3,4,3,2} powinno wyciąć 3,4,3 i dać rezultat {1,2}?

Zgodnie z przykładem to powiedziałbym, że tylko 4 jest maksmimum lokalnym - dokładniej to interpolowałbym w myślach tą funkcję (tak, żeby była ciągła) i wtedy mamy klasyczną definicję maksimum/minimum lokalnego, czyli punkty w których zmienia się znak pochodnej.

2

@wartek01: Definicja powinna być w treści zadania, ale zakładam, że brzmi ona tak:

lokalne maksimim, to wartość elementu szeregu, dla którego wartości poprzedzającego i następującego elementu są niższe.

@totem:
Jeżeli definicja, którą przytoczyłem jest prawidłowa, to nie musisz sobie zawracać głowy sprawdzaniem pierwszego i ostatniego elementu szeregu, bo nie mogą one mieć odpowiednio elementów poprzedzającego/następującego => nie mogą być lokalnymi maksimami szeregu. Przed twoją pętlą musisz dodać pierwszy element, a po pętli ostatni element z wejścia.

Tablica w Javie to coś z czego nie można nic usunąć, można jedynie zmienić wartość. Jeżeli zadeklarujesz sobie tablice o 50 elementach, to ona zawsze będzie miała te 50 elementów. To działa jak tabelka na 50 wierszy narysowana na kartce. Każdy z wierszy istnieje, nie zależnie czy wpiszesz do niego jakąś wartość. W przypadku Java, new int[length]; utworzy ci tablicę o długości length i wypełni ją 0;

Warto zapoznać się z innym, nieco mniej prostym typem kolekcji "List". Dla odmiany te kolekcje mają dynamiczną długość, czyli można do nich zarówno "dodawać", jak i usuwać elementy.
Pewien problem sprawia fakt, że mogą one przechowywać jedynie obiekty, a nie wartości prymitywne, czyli prościej, można do nich włożyć Integer, ale już nie int. Na szczęście (albo i nie...) spora część tej pracy jest wykonywana automatycznie.

Utworzenie pustej listy Integer:
List<Integer> result = new ArrayList<>();

Dodanie nowego elementu do listy:
result.add(5);

Utworzenie int[] zawierającego wszystkie elementy listy:
int[] ints = result.stream().mapToInt(Integer::intValue).toArray();

Gdzie: mapToInt(Integer::intValue) To zamiana obiektowego Integer na prymitywny int.

1 użytkowników online, w tym zalogowanych: 0, gości: 1