Zestawy rozmówBlog

Twoja wymarzona praca? Lets Git IT.
Interaktywna platforma przygotowująca do rozmów technicznych dla nowoczesnych programistów.

XGitHub

Platforma

  • Kategorie

Zasoby

  • Blog
  • O aplikacji
  • FAQ
  • Sugestie

Prawne

  • Polityka prywatności
  • Regulamin

© 2026 LetsGit.IT. Wszelkie prawa zastrzeżone.

Algorytmy

Baza pytań rekrutacyjnych i wiedzy. Filtruj, szukaj i sprawdzaj swoją wiedzę.

Tematy

Wyjaśnij wyszukiwanie binarne.

easysearchbinary-searchalgorithm+1
Otwórz pytanie

Odpowiedź

Wyszukiwanie binarne znajduje element w posortowanej tablicy/liście, porównując go ze środkiem i odrzucając połowę zakresu w każdym kroku. Wymaga danych posortowanych i działa w czasie O(log n) (iteracyjnie zużywa O(1) pamięci).

QuickSort vs MergeSort?

mediumsortingquicksortmergesort+2
Otwórz pytanie

Odpowiedź

Oba to sortowania divide‑and‑conquer. QuickSort dzieli dane względem pivota, działa in‑place i zwykle jest szybki średnio O(n log n), ale ma pesymistyczne O(n²) i nie jest stabilny. MergeSort dzieli i scala, jest stabilny i gwarantuje O(n log n) w pesymistycznym przypadku, ale wymaga O(n) dodatkowej pamięci i dobrze sprawdza się na listach wiązanych oraz przy sortowaniu zewnętrznym.

BFS vs DFS?

mediumgraphbfsdfs+2
Otwórz pytanie

Odpowiedź

BFS przeszukuje graf poziomami używając kolejki i znajduje najkrótszą ścieżkę w grafach nieważonych. DFS schodzi jak najgłębiej używając rekurencji/stosu; przydaje się do sortowania topologicznego, wykrywania cykli i często zużywa mniej pamięci na szerokich grafach.

Co to jest algorytm Dijkstry?

hardgraphshortest-pathdijkstra+1
Otwórz pytanie

Odpowiedź

Algorytm Dijkstry wyznacza najkrótsze ścieżki z jednego źródła w grafie o nieujemnych wagach krawędzi. Wielokrotnie wybiera najbliższy nieodwiedzony wierzchołek (zwykle przez kolejkę priorytetową) i relaksuje krawędzie wychodzące, osiągając O((V+E) log V) z kopcem.

Co to jest programowanie dynamiczne?

harddynamic-programmingoptimizationmemoization
Otwórz pytanie

Odpowiedź

Programowanie dynamiczne rozwiązuje problem przez rozbicie go na mniejsze podproblemy i zapisanie wyników, żeby nie liczyć tego samego wiele razy. Stosuj je, gdy podproblemy się powtarzają, a najlepsze rozwiązanie da się złożyć z najlepszych rozwiązań części (memoizacja/top‑down lub tabela bottom‑up).

BFS vs DFS — jaka jest różnica i kiedy użyć którego?

easybfsdfsgraph+1
Otwórz pytanie

Odpowiedź

BFS idzie warstwami i znajduje najkrótszą ścieżkę w grafie nieważonym. DFS schodzi w głąb i jest wygodny do przeglądania, wykrywania cykli i problemów typu topologicznego.

Co opisuje notacja Big-O?

easybig-ocomplexityperformance
Otwórz pytanie

Odpowiedź

Big-O opisuje, jak rośnie czas lub pamięć wraz z rozmiarem danych n (tempo wzrostu). Pozwala porównywać algorytmy niezależnie od sprzętu.

Na czym polega technika two pointers?

easytwo-pointersarraytechnique
Otwórz pytanie

Odpowiedź

Trzymasz dwa wskaźniki/indeksy (np. lewy/prawy) i przesuwasz je wg reguły, często na posortowanej tablicy lub w oknie przesuwnym. W wielu zadaniach pozwala zejść z dwóch pętli do O(n).

Co znaczy, że sortowanie jest stabilne i dlaczego to ważne?

mediumsortingstable-sortalgorithm
Otwórz pytanie

Odpowiedź

Sortowanie stabilne zachowuje kolejność elementów o równych kluczach. Jest ważne przy sortowaniu po wielu polach (np. najpierw po nazwisku, potem po imieniu).

Algorytm zachłanny vs programowanie dynamiczne — kluczowa różnica?

mediumgreedydynamic-programmingoptimization
Otwórz pytanie

Odpowiedź

Zachłanny wybiera lokalnie najlepszy krok i do niego nie wraca; działa tylko, gdy problem ma własność zachłannego wyboru. DP rozwiązuje nachodzące na siebie podproblemy i reuse’uje wyniki (memoization/tabulation), by zapewnić optimum.

Typowe pułapki w binary search — podaj jedną i jak jej uniknąć.

mediumbinary-searchbugsoverflow
Otwórz pytanie

Odpowiedź

Typowe błędy to niespójne granice (pętla nieskończona) i overflow przy liczeniu środka. Użyj `mid = left + (right - left) / 2` i trzymaj się konsekwentnie zakresu (inclusive/exclusive).

Kiedy BFS może zastąpić algorytm Dijkstry?

hardshortest-pathbfsdijkstra+1
Otwórz pytanie

Odpowiedź

Jeśli wszystkie krawędzie mają ten sam koszt (np. 1), BFS znajduje najkrótsze ścieżki. Gdy wagi są tylko 0 lub 1, można użyć 0–1 BFS na deque; w innych przypadkach potrzebujesz Dijkstry.

Co to jest sortowanie topologiczne i kiedy jest możliwe?

hardtopological-sortdaggraph
Otwórz pytanie

Odpowiedź

To porządek wierzchołków taki, że każda krawędź u→v prowadzi od wcześniejszego do późniejszego. Istnieje tylko dla DAG (grafu skierowanego acyklicznego); cykl oznacza brak poprawnej kolejności.

Jaki problem rozwiązuje algorytm Kadane’a?

hardkadanedynamic-programmingarray
Otwórz pytanie

Odpowiedź

Znajduje maksymalną sumę spójnego (ciągłego) podciągu w O(n), śledząc najlepszą sumę „kończącą się tutaj” i najlepszą globalnie.

KMP vs naiwne szukanie wzorca — na czym polega idea KMP?

hardkmpstring-searchpattern-matching
Otwórz pytanie

Odpowiedź

KMP liczy funkcję prefiksową (LPS), dzięki czemu przy niedopasowaniu przesuwa wzorzec bez ponownego sprawdzania znaków. To daje O(n+m) zamiast O(n·m).

Co to jest rekurencja i czym jest base case?

easyrecursionbase-casecall-stack
Otwórz pytanie

Odpowiedź

Rekurencja to sytuacja, gdy funkcja rozwiązuje problem wywołując samą siebie dla mniejszego wejścia. Base case to warunek stopu bez dalszej rekurencji, dzięki czemu wywołania w końcu się kończą.

Co to jest memoization i kiedy pomaga?

mediummemoizationdynamic-programmingcache
Otwórz pytanie

Odpowiedź

Memoization to cache’owanie wyników funkcji dla danych wejść, żeby kolejne wywołania brały wynik z pamięci. Pomaga przy nachodzących na siebie podproblemach (typowo w DP), gdy te same stany liczone są wiele razy.

Co to jest Quickselect i jaka jest jego średnia złożoność czasowa?

mediumquickselectpartitionselection+1
Otwórz pytanie

Odpowiedź

Quickselect znajduje k-ty najmniejszy element przez partycjonowanie jak QuickSort, ale schodzi rekurencyjnie tylko w jedną stronę. Średnio działa w O(n), a w najgorszym przypadku O(n²) (złe pivoty).

Dlaczego Dijkstra nie działa z ujemnymi wagami krawędzi i czego użyć zamiast?

harddijkstrabellman-fordnegative-weights+1
Otwórz pytanie

Odpowiedź

Dijkstra zakłada, że gdy wierzchołek ma najmniejszy znany dystans, to później już się nie poprawi — ujemne wagi łamią to założenie. Dla ujemnych wag użyj Bellman–Forda (potrafi też wykryć ujemne cykle).

Co to jest monotonic stack i jakie problemy rozwiązuje?

hardstackmonotonic-stacknext-greater+1
Otwórz pytanie

Odpowiedź

Monotonic stack trzyma elementy w kolejności rosnącej albo malejącej. Używa się go do zadań typu „next greater/smaller element”, stock span czy histogram — często w O(n), bo każdy element jest wrzucany i zdejmowany co najwyżej raz.

Co to jest loop invariant i czemu jest przydatny?

easycorrectnessinvariantloops
Otwórz pytanie

Odpowiedź

Loop invariant to własność, która jest prawdziwa przed i po każdej iteracji pętli. Pomaga udowodnić poprawność: jeśli jest prawdziwa na początku, pozostaje prawdziwa w każdym kroku i daje cel na końcu, algorytm jest poprawny.

DP top-down vs bottom-up — jaka jest różnica?

mediumdynamic-programmingmemoizationtabulation
Otwórz pytanie

Odpowiedź

Top-down to rekurencja z memoization (liczenie stanów na żądanie). Bottom-up wypełnia tabelę iteracyjnie od mniejszych podproblemów do większych. Oba podejścia reuse’ują wyniki; wybór zależy od czytelności i kontroli pamięci.

Losowy pivot w QuickSort/Quickselect — czemu pomaga?

mediumrandomizationquicksortquickselect+1
Otwórz pytanie

Odpowiedź

Losowy pivot zmniejsza szansę trafienia „złośliwego” wejścia powodującego najgorszy przypadek O(n²). W praktyce daje dobrą oczekiwaną wydajność i unika wzorców typu już-posortowane dane.

A* vs Dijkstra — jaka jest różnica i kiedy A* jest szybszy?

harda-stardijkstraheuristics+1
Otwórz pytanie

Odpowiedź

Dijkstra rozwija wierzchołki według aktualnego dystansu. A* dodaje heurystykę `h(n)` (szacowany koszt do celu) i priorytetyzuje `g(n)+h(n)`. Przy heurystyce dopuszczalnej (nie zawyża), A* jest optymalny i zwykle odwiedza mniej węzłów, więc bywa szybszy.

Kruskal vs Prim dla MST — czym się różnią?

hardmstkruskalprim+2
Otwórz pytanie

Odpowiedź

Kruskal sortuje krawędzie i dodaje najmniejsze, które nie tworzą cyklu (używa Union-Find). Prim rozbudowuje drzewo od startu, używając kolejki priorytetowej. Oba mogą mieć O(E log E) / O(E log V) zależnie od implementacji.

Backtracking: co to jest i kiedy się go używa?

easybacktrackingsearchpruning+1
Otwórz pytanie

Odpowiedź

Backtracking to przeszukiwanie w głąb drzewa decyzji: budujesz częściowe rozwiązanie, a gdy staje się niepoprawne, cofasz ostatni wybór i próbujesz innej opcji. Stosuje się go m.in. w permutacjach, N-hetmanach, Sudoku i przeszukiwaniu podzbiorów z pruningiem.

Co oznacza amortyzowane O(1)? Wyjaśnij na przykładzie dynamicznej tablicy.

mediumamortizedcomplexitydynamic-array+1
Otwórz pytanie

Odpowiedź

Amortyzowane oznacza “średni koszt na operację w dłuższej sekwencji”, nawet jeśli pojedyncza operacja bywa droga. W dynamicznej tablicy większość appendów to O(1), a czasem płacisz O(n) za resize/kopiowanie — rozłożone na wiele appendów daje O(1) amortyzowane.

Counting sort: kiedy może być szybszy niż sortowanie O(n log n)?

mediumcounting-sortsortingstability+1
Otwórz pytanie

Odpowiedź

Counting sort ma sens, gdy klucze to liczby całkowite z małego zakresu 0..k. Działa w O(n + k), bo zlicza wystąpienia i buduje wynik, i może być stabilny (przydatne jako element radix sort).

NP-trudne vs NP-zupełne: jaka jest różnica?

hardcomplexity-theorynp-hardnp-complete+1
Otwórz pytanie

Odpowiedź

Problemy NP-zupełne są jednocześnie w NP (rozwiązanie da się zweryfikować w czasie wielomianowym) i są NP-trudne. NP-trudne oznacza “co najmniej tak trudne jak problemy z NP”, ale nie musi należeć do NP (np. wersje optymalizacyjne). Jeśli jakikolwiek problem NP-zupełny ma algorytm wielomianowy, to P = NP.

Co liczy algorytm Floyda–Warshalla i jaka jest jego złożoność?

hardgraphsshortest-pathfloyd-warshall+1
Otwórz pytanie

Odpowiedź

Floyd–Warshall liczy najkrótsze ścieżki między wszystkimi parami wierzchołków. Ma czas O(V^3) i pamięć O(V^2), więc jest praktyczny głównie dla mniejszych lub gęstych grafów. Obsługuje ujemne krawędzie, ale nie ujemne cykle.

Co to jest tablica sum prefiksowych i co przyspiesza?

easyprefix-sumrange-querypreprocessing
Otwórz pytanie

Odpowiedź

Tablica sum prefiksowych przechowuje sumę do danego indeksu. Po preprocessingu O(n) możesz liczyć sumę na przedziale w O(1): suma[l..r] = prefix[r] - prefix[l-1]. Używa się tego też do zliczania i szybkich zapytań typu “ile w zakresie”.

Sliding window: co to jest i kiedy jest lepsze niż zagnieżdżone pętle?

mediumsliding-windowtwo-pointerscomplexity
Otwórz pytanie

Odpowiedź

Sliding window utrzymuje przesuwające się okno [l..r] i aktualizuje je w jednym przebiegu. Zwiększasz `r` i przesuwasz `l`, żeby spełnić warunek (np. suma <= X, maks. K różnych). Wiele zadań spada z O(n^2) do O(n), bo każdy wskaźnik przesuwa się w prawo maksymalnie n razy.

Rabin–Karp: co to jest rolling hash i jaki jest główny haczyk?

mediumstringhashingrabin-karp+1
Otwórz pytanie

Odpowiedź

Rolling hash pozwala szybko zaktualizować hash okna po przesunięciu o 1 znak (usuń lewy, dodaj prawy). Rabin–Karp porównuje hashe, żeby znaleźć kandydatów, a potem zwykle weryfikuje substring, żeby uniknąć fałszywych trafień. Haczyk: możliwe są kolizje hashy, więc bez weryfikacji nie masz gwarancji poprawności.

Co to jest kolejka monotoniczna i jak daje max w oknie w O(n)?

harddequemonotonic-queuesliding-window+1
Otwórz pytanie

Odpowiedź

Kolejka monotoniczna to deque trzymany w porządku malejącym (lub rosnącym). Dla maksimum w oknie usuwasz z końca mniejsze elementy przy dodawaniu nowego, więc na początku zawsze jest max. Usuwasz też z początku elementy, które wyszły z okna. Każdy element wchodzi i wychodzi maks. raz, więc całość to O(n).

Bitmask DP (subset DP): co to jest i jaka jest typowa złożoność?

harddpbitmasksubset+2
Otwórz pytanie

Odpowiedź

Bitmask DP używa maski bitowej do reprezentacji podzbioru (np. które wierzchołki odwiedziłeś). Klasyczny zapis: dp[mask][i] = najlepszy wynik dla podzbioru `mask` kończący się w `i` (np. w TSP). Typowa złożoność jest wykładnicza, często O(n^2 * 2^n) czasu i O(n * 2^n) pamięci.

Algorytmy zachłanne: jaka własność sprawia, że wybór zachłanny jest poprawny?

mediumgreedycorrectnessexchange-argument+1
Otwórz pytanie

Odpowiedź

Algorytm zachłanny jest poprawny, gdy problem ma własność greedy-choice oraz optimal substructure. Intuicyjnie da się to udowodnić argumentem wymiany: lokalnie najlepszy wybór można „wymienić” w rozwiązaniu optymalnym, więc lokalny wybór prowadzi do globalnego optimum.

KMP: jak tablica LPS/prefix pomaga uniknąć ponownego porównywania znaków?

hardkmpstringpattern-matching+1
Otwórz pytanie

Odpowiedź

KMP wylicza dla wzorca tablicę LPS (najdłuższy proper prefix będący jednocześnie suffixem). Przy niedopasowaniu przesuwa wzorzec zgodnie z LPS zamiast cofać wskaźnik tekstu, więc znaki tekstu nie są porównywane ponownie.

Bellman–Ford: kiedy go używasz i jaką ma przewagę nad Dijkstrą?

mediumbellman-fordshortest-pathgraphs+1
Otwórz pytanie

Odpowiedź

Bellman–Ford stosujesz, gdy występują ujemne wagi krawędzi. Potrafi wykryć ujemne cykle przez dodatkową rundę relaksacji. Minusem jest wolniejsza złożoność: O(V·E).

Kruskal vs Prim: jaka jest główna różnica i typowe struktury danych?

mediummstkruskalprim+2
Otwórz pytanie

Odpowiedź

Kruskal buduje MST, sortując krawędzie i dodając je, jeśli nie tworzą cyklu (zwykle z DSU/Union‑Find). Prim rozrasta MST od wybranego wierzchołka, używając kolejki priorytetowej. Kruskal bywa lepszy dla grafów rzadkich, a Prim wygodny przy listach sąsiedztwa.

Quickselect: do czego służy i jaka jest jego oczekiwana złożoność?

mediumquickselectselectionpartition+1
Otwórz pytanie

Odpowiedź

Quickselect służy do znalezienia k‑tego elementu (np. mediany) bez pełnego sortowania tablicy. Używa partycjonowania jak quicksort i ma oczekiwane O(n), ale w najgorszym przypadku może spaść do O(n^2).

Binary search on answer (parametric search): kiedy to ma zastosowanie?

mediumbinary-searchparametric-searchmonotonic+1
Otwórz pytanie

Odpowiedź

Stosuje się to, gdy możesz zdefiniować monotoniczny predykat po przestrzeni odpowiedzi (np. „czy istnieje rozwiązanie z wartością ≤ X?”). Wtedy binarnie wyszukujesz minimalne/maksymalne X spełniające warunek.

Wykrywanie cyklu Floyda (żółw i zając): co wykrywa i jakie ma koszty czas/pamięć?

easycycle-detectiontortoise-harelinked-list+1
Otwórz pytanie

Odpowiedź

Wykrywa cykle w liście lub dowolnej sekwencji iteracyjnej, przesuwając jeden wskaźnik dwa razy szybciej niż drugi. Jeśli się spotkają, jest cykl. Działa w O(n) czasu i O(1) pamięci.

Heap sort: jaka jest złożoność czasowa, pamięciowa i stabilność?

mediumheapsortsortingcomplexity+1
Otwórz pytanie

Odpowiedź

Heapsort działa w O(n log n), używa O(1) dodatkowej pamięci (in‑place) i nie jest stabilny (równe elementy mogą zmienić kolejność).

A*: jak heurystyka wpływa na optymalność?

harda-starheuristicshortest-path+1
Otwórz pytanie

Odpowiedź

A* używa f(n) = g(n) + h(n). Jeśli heurystyka h jest dopuszczalna (nie przeszacowuje) i spójna, A* jest optymalny i odwiedza mniej węzłów niż Dijkstra. Gdy h przeszacowuje, optymalność nie jest gwarantowana. Dla h = 0 A* redukuje się do Dijkstry.

Boyer–Moore majority vote: co rozwiązuje i jaka jest główna idea?

mediummajority-votearraylinear-time+1
Otwórz pytanie

Odpowiedź

Znajduje element występujący więcej niż n/2 razy (jeśli istnieje). Idea polega na „kasowaniu” par różnych elementów; pozostały kandydat to większość. Działa w O(n) czasu i O(1) pamięci.