Na studiach jest z tego jeden lub dwa przedmioty. Jak poznasz podstawy jak działają algorytmy, jakie są rodzaje złożoności i tak dalej to reszty będziesz w stanie się uczyć we własnym zakresie Przeczytaj Cormena albo ogarnij jakiś typowy kurs ze studów, gdzie cię nauczą z podstawowej teorii, podstawowych algorytmów, grafów i tak dalej
Przy okazji zapytam czy macie jakieś porady jak optymalnie podchodzić do nauki tych tematów - na czym się skupiać,
Warto próbować wsadzić klocek do każdego możliwego otworu. Jak masz problem to zadajesz sobie pytanie jak rozwiązać to w O(log(N)). Jak nie wiesz to jak rozwiązać to w O(N). Przy pewnej wprawie zaczniesz łapać które rozwiązanie pasuje do problemu a które nie mają prawa działać choć jeszcze nie wiesz jakie rozwiązanie jest najlepsze.
Oczywiście duża część problemów to typowe kopiuj wklej. Jak masz doświadczenie to od razu wiesz, że do zadania znajdź unikatową wartość w tablicy, gdzie reszta to duplikaty należy użyć XORa, bo ta algebra idealnie pasuje do rozwiązania. Albo jak widzisz, że gdzieś jest naturalna rekursja to warto spróbować ją jakoś przekształcić do programowania dynamicznego, bo w taki sposób najczęściej upraszcza się dużą złożoność rekursji. Tak naprawdę rozwiązywanie algorytmów to duża biegłość w adaptacji gotowych rozwiązań, które już się widziało do tego co pytają w zadaniu
nie mając teorii za sobą i teraz spotykam problemy które w constraints mają określone złożoności czasowe oraz pamięciowe i wymuszają aby użyć danego algorytmu albo techniki (ostatnio się dowiedziałem o operacjach in-place zamiast tworzenia dodatkowych struktur) o których nie mam pojęcia i jest to blokada
Poczytaj o złożoności obliczeniowej, bo to jest klucz odpowiedzi przy algorytmach. Doświadczona osoba po prostu zawsze wie, że celem jest jak najlepsza złożoność co indukuje, że szukamy rozwiązania, które stara się redukować użycie pamięci poprzez jej ponowne użycie.