• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zadanie - Dwie sumy.

Object Storage Arubacloud
0 głosów
97 wizyt
pytanie zadane 4 listopada 2023 w Java przez rafalmagician Obywatel (1,320 p.)

Mam prośbę o pomoc w zrozumieniu zadania:

Zad.: Mając tablicę liczb całkowitych, zwróć indeksy dwóch liczb w taki sposób, aby sumowały się do określonej wartości docelowej. Możesz założyć, że każde wejście będzie miało dokładnie jedno rozwiązanie i nie możesz użyć tego samego elementu dwa razy.

i napisałem taki kod:

        int[] numbers = {2, 7, 11, 15};
        int target = 18;

        for (int i = 0; i < numbers.length - 1; i++) {
            for (int j = i + 1; j < numbers.length; j++) {
                if (((numbers[i] + numbers[j])) == target) {
                    System.out.println("indeksy: [" + i + "] i [" + j + "]");
                }
            }
        }

Czy coś muszę zmienić w kodzie?

1 odpowiedź

+1 głos
odpowiedź 4 listopada 2023 przez Wiciorny Ekspert (270,770 p.)

Zadanko powiedzmy jest dobrze zrobione, ale bardzo nieefektywnie... ogromna złożoność obliczeniowa z racji zagnieżdzenia pętli for w for, co wydłusza liczbę operacji praktycznie do kwadratu liczby elementów,.

W twoim rozwiązaniu dla  każdej pary elementów w tablicy sprawdzasz  czy ich suma równa się docelowej wartości.

Zdecydowanie tutaj warto posiłkować się np. wyrzkoystaniem mapy w Javie https://docs.oracle.com/javase/8/docs/api/java/util/Map.html intefejs ten jest dla kolekcji zawierającej klucz-> unikalny i przypisana mu wartość,

Wtedy robisz tylko jedno przejście iteracyjne ze sprawdzeniem realnie, czy dany element istnieje w mapie- co jest potwierdzeniem, że wystąpił więcej niż raz.

Np. 

    public int[] twoindexSum(int[] nums, int target) {
        Map<Integer, Integer> numIndexMap = new HashMap<>();

        Optional<int[]> result = IntStream.range(0, nums.length)
                .boxed()
                .filter(i -> numIndexMap.containsKey(target - nums[i]))
                .map(i -> new int[]{numIndexMap.get(target - nums[i]), i})
                .findFirst();

        return result.orElse(new int[0]);
    }

tu masz jeszcze referencje do wykorzystania  autobozxingu z metody https://www.geeksforgeeks.org/intstream-boxed-java, natomiast pozostałe funkcje pośrednie jak i końcowe warto przestudiować. 

Czym jest Optional to także można wyjasnić: 
https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html

Co jeszcze? A no przemyśl sytuacje, że zadanie twoje jest prawdziwe i poprawne, kiedy liczba elementów jest równa 2, nie więcej, dodatkowo, jeśli nie ma elementów warto zwrócić informacje np.  o braku rozwiązania, dla konkretnego zestawu testowego 

Podobne pytania

+1 głos
1 odpowiedź 206 wizyt
pytanie zadane 12 lutego 2022 w Java przez mewtwo Użytkownik (830 p.)
+1 głos
0 odpowiedzi 581 wizyt
pytanie zadane 12 lutego 2022 w Java przez mewtwo Użytkownik (830 p.)

92,626 zapytań

141,488 odpowiedzi

319,849 komentarzy

62,009 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...