Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pa:laboratoare:laborator-00 [2025/02/24 22:34]
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 al k-lea cel mai mare număr din vector. ​
 +       * **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]]. 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>​
  
-* **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.  +<​spoiler ​Soluția 1>  
-   * **Restricții**:​  +Putem sorta vectorul crescător și să întoarcem al k-lea element de la finalul vectorului. Complexitate este de $ O(n log n) $.
-     * $ 1 <= k <= n <= 10^5 $ +
-     * elementele vectorului au valori cuprinse între 0 și $ 10 ^ 9 $ +
- +
-<​spoiler ​soluția 1>  +
-Putem sorta vectorul crescător și să întoarcem al k-lea element de la finalul vectorului.+
 </​spoiler>​ </​spoiler>​
  
-<​spoiler ​soluția 1 implementată în C++> ​+<​spoiler ​Soluția 1 implementată în C++> ​
 <code cpp> <code cpp>
-   #​include <​algorithm>​ +class Solution { 
-   class Solution { + ​public:​ 
-    public: +   ​int findKthLargest(vector<​int>&​ nums, int k) { 
-       ​int findKthLargest(vector<​int>&​ nums, int k) { +       ​std::​sort(nums.begin(),​ nums.end());​ 
-           ​std::​sort(nums.begin(),​ nums.end());​ +       ​return nums[nums.size() - k]; 
-           ​return nums[nums.size() - k]; +   ​
-       ​+};
-   ​};+
 </​code>​ </​code>​
 </​spoiler>​ </​spoiler>​
  
-* **Task02**: Rezolvați problema ​[[https://​leetcode.com/problems/sliding-window-maximum/| Sliding Window Maximum]].+<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>​
  
-* **Task03**: Rezolvați problema [[https://​leetcode.com/​problems/​longest-substring-without-repeating-characters| Longest Substring without repeating characters]].+  ​* **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ă.
  
-* **Task04**: Rezolvați problema [[https://​leetcode.com/​problems/​min-stack/​description/​| Min Stack]].+  ​* **Task03**: Rezolvați problema [[https://​leetcode.com/​problems/​min-stack/​description/​| Min Stack]].
pa/laboratoare/laborator-00.1740429267.txt.gz · Last modified: 2025/02/24 22:34 by radu.nichita
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0