This shows you the differences between two versions of the page.
pa:laboratoare:laborator-00 [2025/02/24 22:04] radu.nichita |
pa:laboratoare:laborator-00 [2025/03/06 22:57] (current) darius.neatu [Exercitii] |
||
---|---|---|---|
Line 69: | Line 69: | ||
Task-uri: | Task-uri: | ||
- | * **Task00**: Citiți README de pe pagina principala [[https://github.com/acs-pa/pa-lab | pa-lab]]. Alegeți un limbaj de programare dintre C++ și Java și parcurgeți tutorialul aferent din [[https://github.com/acs-pa/pa-lab/tree/main/skel/lab00 | pa-lab::skel/lab00]]. | + | * **Task00**: Citiți README de pe pagina principala [[https://github.com/acs-pa/pa-lab | pa-lab]]. Alegeți un limbaj de programare dintre C++ și Java și parcurgeți tutorialul aferent din [[https://github.com/acs-pa/pa-lab/tree/main/skel/lab00 | pa-lab::skel/lab00]]. |
- | * **Task01**: Se dă un vector cu n elemente și un număr k. Aflați cele mai mici k numere din vector. | + | * **Task01**: Se dă un vector cu n elemente și un număr k. Aflați al k-lea cel mai mare număr din vector. |
- | * **Restricții**: $ 1 <= k <= n <= 10^5 $ | + | * **Restricții**: |
+ | * $ 1 <= k <= n <= 10^5 $ | ||
+ | * Elementele vectorului au valori cuprinse între 0 și $ 10 ^ 9 $ | ||
+ | <note> | ||
+ | Ca să înțelegem cum ne dorim să procedăm la PA, următoarea problemă este rezolvată. Soluțiile pentru această problemă se pot încărca pe platforma [[https://leetcode.com/problems/kth-largest-element-in-an-array/description/ | Leetcode]]. | ||
+ | </note> | ||
- | * **Task02**: Rezolvați problema [[https://leetcode.com/problems/sliding-window-maximum/| Sliding Window Maximum]]. | + | <spoiler Soluția 1> |
+ | Putem sorta vectorul crescător și să întoarcem al k-lea element de la finalul vectorului. Complexitate este de $ O(n log n) $. | ||
+ | </spoiler> | ||
- | * **Task03**: Rezolvați problema [[https://leetcode.com/problems/longest-substring-without-repeating-characters| Longest Substring without repeating characters]]. | + | <spoiler Soluția 1 implementată în C++> |
+ | <code cpp> | ||
+ | class Solution { | ||
+ | public: | ||
+ | int findKthLargest(vector<int>& nums, int k) { | ||
+ | std::sort(nums.begin(), nums.end()); | ||
+ | return nums[nums.size() - k]; | ||
+ | } | ||
+ | }; | ||
+ | </code> | ||
+ | </spoiler> | ||
- | * **Task04**: Rezolvați problema [[https://leetcode.com/problems/min-stack/description/| Min Stack]]. | + | <spoiler Soluția 1 implementată în Java> |
+ | <code java> | ||
+ | class Solution { | ||
+ | public int findKthLargest(int[] nums, int k) { | ||
+ | Arrays.sort(nums); | ||
+ | return nums[nums.length - k]; | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | <spoiler Soluția 2> | ||
+ | Pentru soluția precedentă, nu ne-am folosit de faptul că $ k < n $, deci s-ar putea obține ceva mai eficient. Trebuie să parcugem măcar o dată vectorul, deci mai puțin de $ O(n)$ nu putem obține. Fix n pași nu putem face, trebuie să îl folosim pe k. Deoarece ne trebuie al k-lea cel mai mare element, intuitiv ar trebui să ținem minte într-o structură de date cele mai mari k elemente din vector. | ||
+ | |||
+ | Ce structură alegem? Dorim să putem insera în ea și să ne zică maximul. Am fi tentați să folosim un max heap. | ||
+ | |||
+ | Când am adăuga un nou element, am dori să îl ștergem pe cel mai mic din structura de date. Prin urmare, am putea să folosim un min heap, în care ne propunem ca la orice moment stocăm cele mai mari k elemente din vector, parcurse până acum. | ||
+ | |||
+ | Astfel: | ||
+ | |||
+ | 1. Se adaugă inițial primele k elemente în heap. | ||
+ | |||
+ | 2. Pentru fiecare din elementele următoarele, dacă acesta este mai mare decât minimul din heap, se șterge minimul și se adaugă elementul curent. Mereu în heap avem k elemente la final de pas în această etapă. | ||
+ | |||
+ | 3. Răspunsul este minimul din heap la finalul parcurgerii. | ||
+ | |||
+ | Complexitate este de $ O(n log k) $, care este mai bună. Implementați și testați pe Leetcode! | ||
+ | |||
+ | </spoiler> | ||
+ | |||
+ | <spoiler Soluția 3> | ||
+ | Hint: Soluția 2 nu este optimă! Se poate și $O(n)$, dar considerăm că este înafara scopului laboratorului 0. | ||
+ | </spoiler> | ||
+ | |||
+ | * **Task02**: Discutați problema [[https://leetcode.com/problems/sliding-window-maximum/| Sliding Window Maximum]] și problema [[https://leetcode.com/problems/longest-substring-without-repeating-characters| Longest Substring without repeating characters]]. Implementați și testați cel puțin o problemă. | ||
+ | |||
+ | * **Task03**: Rezolvați problema [[https://leetcode.com/problems/min-stack/description/| Min Stack]]. |