Elakadtam egy HackerRanks feladatban, hol lehet a hibám? (bármely C szerű nyelvben)
HackerRanks, Picking numbers feladat. Nem konkrét interjúra vagy ilyesmire kell és nem iskolai feladat, az oldal email-ben küldte.
Given an array of integers, find and print the maximum number of integers you can select from the array such that the absolute difference between any two of the chosen integers is less than or equal to 1.
....
Sample Input 0
6 a hossza
4 6 5 3 3 1 a számok, nem feltétlenül rendezett, mint a mellékelt ábra is mutatja
Sample Output 0
3
https://pastebin (pont) com/ZAHk1W0F
Hol a hibám?
Ez C#, de nem muszáj ahhoz ragaszkodni, bármely C nyelvben megérteném a lényeget. :)
HashMap-ben (illetve nekünk inkább dictionary a releváns) a worst case keresés és beszúrás O(n) idejű.
Az oké, hogy átlagosan sokkal gyorsabb...
Ez így van. És most gondold át, hogy számok esetében mikor lesz ütközés.
Csak akkor, ha a szám nem fér bele a hashbe.
Ezt ellenőrizni O(1)-es művelet és ez esetben másik HashMap-be rakjuk, ilyen egyszerű.
Igen, és ugyanott vagyunk ahonnan kiindultunk... exponenciális méretű memóriára van szükség.
Nyilván a 1-99-cel nincs gond, ott jó az int[99] is...
Memória=tárhely=space, értsd ahogy szeretnéd.. nyilván nem fontos hogy RAM legyen. Azért, hogy biztosan elkerüld az ütközéseket. Csak gondolj bele.
NYilván attól függ, hogy mennyi tárhely kell, hogy legrosszabb esetben mennyi ütközés elfogadott. Ha O(log n)-es hashmeter szeretnél, akkor nem kell exponenciális....de akkor nem lesz az algoritmusod lineáris.
(Egyébként lehet létezik lineáris algoritmus, most csak a map-es megoldásról beszéltem)
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!