← कोर्सच्या मुख्य पानाकडे परत

📐 12 धडे आकृत्यांमध्ये

भाग 1: जागा (पिवळसर, 1–6) · भाग 2: चाली (निळा, 7–12). प्रत्येक आकृती म्हणजे खरी structure — आणि प्रत्येकीखाली हाताळता येणारी lab: ट्रे ठेवा, नाव hash करा, search पावलापावलाने चालवा, झाड वाढवा, नकाशा चाला. वर्तुळातले आकडे 1 → 2 → 3 या क्रमाने पहा.

1 📏 DSA & Big-O का

शाळा दुप्पट झाल्यावर काम कसे वाढते — O(1), O(log n), O(n), O(n log n), O(n²); आकार हाच अख्खा विषय.

🧒 सोप्या शब्दांत

प्रगतिपुस्तके वाटण्याचा विचार करा. शाळा 1,000 वरून 2,000 विद्यार्थ्यांची झाली की काही कामांना तेवढाच वेळ लागतो, काहींना दुप्पट, आणि प्रत्येक विद्यार्थ्याची प्रत्येकाशी तुलना करायला चारपट. वाढीच्या या आकारालाच Big-O म्हणतात, म्हणजे शाळा वाढण्याआधीच खर्च कळतो.

📖 नवे शब्दBig-O — गोष्टी वाढल्या की काम कसे वाढते त्याचे लेबलn — तुमच्याकडे किती गोष्टी आहेत, उदा. शाळेतील विद्यार्थीO(log n) — विद्यार्थी दुप्पट, फक्त एक step जास्तO(n) — विद्यार्थी दुप्पट, काम दुप्पटO(n²) — विद्यार्थी दुप्पट, काम चारपट
1📈 शाळा वाढते तशी पावले कशी वाढतातn — शाळेतले विद्यार्थी (0 → 40)पावले (0 → 160)102040n दुप्पट →O(1)O(log n)O(n)O(n log n)O(n²)O(2ⁿ)2🏫 शाळा दुप्पट: 1,000 → 2,000 विद्यार्थीआकारn = 1,000n = 2,000n दुप्पट →O(1)11तेचO(log n)1011+1 नजरO(n)1,0002,000×2O(n log n)10,00022,000×2.2O(n²)1,000,0004,000,000×43🧮 आकाराला नाव — तीन नियम3n + 5O(n)constants सोडाn² + nO(n²)सगळ्यात मोठे पद ठेवाx in listO(n)worst case: ते शेवटी आहे
⏪ आधी

Big-O शिवाय शाळा दुप्पट झाल्यावर program अचानक चारपट वेळ घेतो तेव्हाच तो slow आहे हे कळते.

💡 काय

n वाढला की steps कसे वाढतात त्याच्या आकाराला Big-O नाव देते: O(1), O(log n), O(n), O(n log n), O(n²).

⚙️ कसे

constants काढा आणि सर्वात मोठे पद ठेवा: 3n + 5 म्हणजे O(n), n² + n म्हणजे O(n²), आणि x in list worst case मध्ये O(n).

🎯 का

1,000 चे 2,000 विद्यार्थी झाले तर O(log n) ला फक्त +1 look, पण O(n²) ला ×4 काम; म्हणून आकारच पुढचा खर्च ठरवतो.

🚀 पुढे

arrays पासून graphs पर्यंत पुढचा प्रत्येक lesson याच एका मापाने तपासला जातो: n दुप्पट झाला की खर्च कसा वाढतो?

🧪 Try it here — n हलवा आणि आकार वाढताना पहा

संपूर्ण धडा 01 वाचा →

2 🗄️ Arrays & strings

लॉकर्सची रांग — लॉकर 17 वर एका पावलात; पुढे घातले की सगळे सरकतात; two pointers आणि sliding window.

🧒 सोप्या शब्दांत

शाळेचे lockers एकाच क्रमांकित रांगेत आहेत, सगळे एकाच आकाराचे. locker 17 गाठायला इतर lockers ओलांडावे लागत नाहीत; एका step मध्ये थेट तिथे जाता येते. पण locker 0 मध्ये नवा विद्यार्थी घुसवला तर प्रत्येकाला एक locker पुढे सरकावे लागते, म्हणून सुरुवातीला जोडणे हळू आणि शेवटी जोडणे जलद.

📖 नवे शब्दarray — शेजारी-शेजारी ठेवलेल्या समान आकाराच्या खोक्यांची रांग, प्रत्येकाला क्रमांकindex — खोक्याचा क्रमांक, 0 पासून सुरूO(1) — खोकी कितीही असली तरी एकच steptwo pointers — क्रमाने लावलेल्या रांगेत दोन्ही टोकांकडून चालणारी दोन बोटे, एका फेरीत जोडी शोधायला
1🗄️ लॉकर्स — कोणताही index एका पावलातAishwarya0Katrina1Dipika2Meera3Zoya4lockers[3]→ Meera, 1 पाऊलपत्ता = सुरुवात + 3 × आकार → O(1), 5 लॉकर असोत की 50 लाख2↔️ insert(0, "Rohan") — सगळे सरकतात: O(n)आधीAishwaryaKatrinaDipikaMeeraZoyaनंतरRohanAishwaryaKatrinaDipikaMeeraZoya5 लॉकर्ससाठी 5 हालचाली — n साठी n · शेवटी append: O(1)3👯 two pointers — कोणत्या दोघांची बेरीज 13?1021324364758697i ची सुरुवातij1 + 9 = 10 < 13 → i उजवीकडे … 4 + 9 = 13 ✓ → (3, 7) — एक फेरी, O(n)4🪟 sliding window — सलग 3 सर्वोत्तम दिवस3081229374156647sum 19 ✓पुढची window: + 7 − 8 = 18सरकाएक आत, एक बाहेर: n पावले — n × k नाही
⏪ आधी

क्रमांक असलेले lockers नसतील तर slot 3 मधला विद्यार्थी शोधायला सुरुवातीपासून प्रत्येक locker पार करावा लागतो.

💡 काय

array म्हणजे शेजारी-शेजारी ठेवलेली समान आकाराच्या lockers ची रांग, त्यामुळे कोणताही index एका step मध्ये मिळतो.

⚙️ कसे

address = start + index × size, म्हणून lockers[3] एका step मध्ये Meera देतो, पण insert(0) सर्व n items सरकवतो: O(n).

🎯 का

index ने जलद वाचन, शेवटी O(1) append, आणि two pointers सारख्या युक्त्या O(n²) शोध एका O(n) pass मध्ये आणतात.

🚀 पुढे

insert करताना सरकवणे महाग पडते तेव्हा पुढचा lesson linked lists वापरून index jump च्या बदल्यात स्वस्त insert देतो.

🧪 Try it here — एका पावलात index, पुढे घाला आणि हालचाली मोजा

संपूर्ण धडा 02 वाचा →

3 🧵 Linked lists

खजिन्याचा शोध — प्रत्येक चिठ्ठी सांगते पुढची कुठे; चिठ्ठी जोडायला O(1), शोधायला O(n), उडी नाही; जागच्या जागी उलटी करा.

🧒 सोप्या शब्दांत

treasure hunt मध्ये प्रत्येक चिठ्ठी पुढची चिठ्ठी कुठे लपवली आहे ते सांगते. सुरुवातीला नवी चिठ्ठी जोडणे सोपे: ती लिहा, जुन्या पहिल्या चिठ्ठीकडे दाखवा, आणि बाकी कोणीच हलत नाही. पण चौथी चिठ्ठी गाठायला आधीच्या तीन वाचाव्या लागतात, कारण चिठ्ठ्यांना थेट उडी मारता येईल असे क्रमांक नसतात.

📖 नवे शब्दlinked list — चिठ्ठ्यांची साखळी, प्रत्येक चिठ्ठी पुढचीकडे दाखवतेnode — एक चिठ्ठी: एक value आणि पुढच्या चिठ्ठीकडचा बाणhead — पहिली चिठ्ठी, जिथून शोध सुरू होतोpointer — 'पुढची चिठ्ठी इथे आहे' सांगणारा बाण
1🧵 खजिन्याचा शोध — प्रत्येक चिठ्ठी सांगते पुढची कुठेheadAishwarya•Katrina•Dipika•Meera∅∅ = शेवटची चिठ्ठी · कोणत्याच चिठ्ठीला क्रमांक नाहीMeera पर्यंत जायला आधी Aishwarya, Katrina, Dipika वाचा — O(n) · पण चिठ्ठी जोडली/काढली तरी बाकीच्या कधीच सरकत नाहीत2✏️ push_front("Rohan") — एक नवी चिठ्ठी, O(1)Rohan•Aishwarya•Katrina•…head (नवे)head (जुने)1 जुन्या पहिल्या चिठ्ठीकडे दाखवणारी नवी चिठ्ठी लिहा2 head तिच्याकडे न्या — दुसरे कोणीच हलत नाहीहातातल्या कोणत्याही चिठ्ठीवर तीच युक्ती: O(1) insert / removearray insert(0): n हालचाली · linked list: 1 हालचाल3🔁 जागच्या जागी उलटी — प्रत्येक बाण फिरवाAishwarya∅Katrina•Dipika•Meera•prevcurnextनवे headतीन नावे list वरून चालतात: next जपा, cur ला prev कडे वळवा, पुढे जाO(n) वेळ, O(1) जास्तीची जागा — मुलाखतीतला classiccur.next, prev, cur = prev, cur, cur.next
⏪ आधी

array मध्ये पुढे एक विद्यार्थी जोडला तर बाकी सर्व lockers सरकतात, n विद्यार्थ्यांसाठी n moves.

💡 काय

linked list म्हणजे चिठ्ठ्यांचा treasure hunt, जिथे प्रत्येक चिठ्ठीत value आणि पुढच्या चिठ्ठीकडे pointer असतो.

⚙️ कसे

push_front एक नवी चिठ्ठी जुन्या head कडे point करून लिहितो आणि head तिच्याकडे हलवतो: O(1), पण Meera शोधणे O(n).

🎯 का

हातातल्या चिठ्ठीजवळ जोडणे किंवा काढणे O(1) आहे आणि array insert सारखे इतर कोणीही सरकत नाही.

🚀 पुढे

जोडलेले nodes पुढच्या lessons मधल्या stacks, queues, trees आणि graphs चे मूळ घटक बनतात.

🧪 Try it here — चिठ्ठी push करा, एक शोधून उड्या मोजा, शोध उलटा करा

संपूर्ण धडा 03 वाचा →

4 🥞 Stacks & queues

ट्रेची चळत आणि जेवणाची रांग — LIFO आणि FIFO; brackets, undo, call stack; रांग सोडणे O(1) व्हावे म्हणून ring buffer.

🧒 सोप्या शब्दांत

canteen मध्ये स्वच्छ trays चा ढीग असतो आणि तुम्ही नेहमी वरचा tray घेता: शेवटी ठेवलेला tray आधी उचलला जातो. जेवणाची रांग उलट: आधी आलेल्याला आधी जेवण. computers दोन्ही सतत वापरतात, undo बटणासाठी आणि वाट पाहणाऱ्या पाळ्यांसाठी, आणि ring buffer मुळे कोणालाही न सरकवता रांग पुढे जाते.

📖 नवे शब्दstack — ढीग: शेवटी आलेला आधी बाहेर (LIFO)queue — रांग: आधी आलेला आधी बाहेर (FIFO)push / pop — वर एक ठेवणे / वरून एक काढणेring buffer — गोल रांग जिथे फक्त 'पुढचा' खूण हलते, म्हणून कोणी सरकत नाही
1🥞 stack — ट्रेची चळत (LIFO)ट्रे 10ट्रे 20ट्रे 30ट्रे 40वर →push(40)pop() → 30push · pop · peek — सगळे O(1)2🍽️ queue — जेवणाची रांग (FIFO)AishwaryaKatrinaDipikaMeeraपुढेमागेdequeue→ AishwaryaZoyaenqueue(Zoya)मागून सामील, पुढून सेवा · list.pop(0) सगळ्यांना सरकवते: O(n) — deque किंवा ring buffer: O(1)3🔄 ring buffer — डोके सरकते, कोणीच सरकत नाही01Dipika2Meera3Zoya4Arjun567headtailवळसा: (i + 1) % 8dequeue: head += 1 · enqueue: tail += 1 — दोन्ही O(1) · भरला? दुप्पट आकाराच्या buffer मध्ये copy (क्वचित)
⏪ आधी

lunch line साठी list.pop(0) वापरले तर प्रत्येक वेळी सर्वांना पुढे सरकवावे लागते: प्रत्येक जाण्याला O(n).

💡 काय

stack म्हणजे trays चा ढीग, शेवटी आलेला आधी बाहेर (LIFO); queue म्हणजे lunch line, आधी आलेला आधी बाहेर (FIFO).

⚙️ कसे

push, pop, peek फक्त top ला हात लावतात: O(1); ring buffer मध्ये (i + 1) % 8 ने head आणि tail हलतात, कोणी सरकत नाही.

🎯 का

bracket matching, undo, call stack आणि न्याय्य रांगा हे सर्व यांच्यावर चालते, प्रत्येक operation O(1) मध्ये.

🚀 पुढे

recursion मध्ये call stack पुन्हा येतो, आणि lesson 10 मध्ये graphs शोधताना queue BFS चालवते.

🧪 Try it here — ट्रे वर जातात, रांगेला पुढून सेवा

संपूर्ण धडा 04 वाचा →

5 🗂️ Hash maps & sets

नावानुसार कप्पे — hash(name) सांगते कोणता कप्पा; सरासरी O(1); collisions, rehashing, मोजणी, dedupe.

🧒 सोप्या शब्दांत

शाळेच्या office मध्ये pigeonholes आहेत. प्रत्येक कप्पा शोधण्याऐवजी एक नियम विद्यार्थ्याच्या नावाचा box क्रमांक बनवतो, म्हणून तुम्ही थेट Meera च्या box कडे जाता. कधी दोन नावे एकाच box मध्ये येतात; हरकत नाही, एक-दोन cards तपासायचे. boxes खूप भरले की office त्यांची संख्या दुप्पट करते आणि सगळ्यांना एकदा पुन्हा मांडते.

📖 नवे शब्दhash — नावाचे box क्रमांकात रूपांतर करणारा नियमhash map — नावाने जवळजवळ एका step मध्ये सापडणारे boxes, dict सारखेcollision — दोन नावे एकाच box मध्ये येणेload factor — boxes किती भरले आहेत; 0.75 झाले की दुप्पट करायची वेळset — फक्त नावे, values नाहीत; duplicates काढायला उत्तम
1🗂️ hash table — नावानुसार कप्पेDipikaKatrinaZoyaMeerahash(name) % 801234567Meera: 4ADipika: 3AZoya: 3B💥 collision: दोन कार्डे, दोन नजराKatrina: 3Aput / get: कप्पा मोजा, उघडा, एक-दोन कार्डे पहा — सरासरी O(1)वाईट hash सगळ्यांना एका कप्प्यात टाकते → O(n); चांगले समान पसरवते2📈 load factor — कप्पे कधी दुप्पट करायचे8 कप्पे, 6 कार्डे → load 0.75: rehash16 कप्पे, 6 कार्डे → load 0.38: पुन्हा छोटे कप्पेप्रत्येक कार्ड एकदा पुन्हा लावले — क्वचित, म्हणून सरासरी अजूनही O(1)3🧰 dict आणि set कामावरतो3cat1sat1counts[w] += 1 — एक फेरी{Aishwarya, Katrina, Dipika}x in s → O(1)set = values नसलेला dictएका फेरीत two-sum: seen[target − x]keys hashable हव्यात: str, int, tuple — list नाही
⏪ आधी

साध्या list मध्ये नावाने विद्यार्थी शोधायचा तर तो सापडेपर्यंत प्रत्येक card वाचावे लागते: प्रत्येक वेळी O(n).

💡 काय

hash map प्रत्येक item त्याच्या नावावरून ठरलेल्या pigeonhole मध्ये ठेवतो, म्हणून key ने शोध सरासरी O(1).

⚙️ कसे

hash(name) % 8 box निवडतो; collision झाले तर एकाच box मध्ये दोन cards, आणि load 0.75 झाला की 16 boxes करून पुन्हा मांडणी.

🎯 का

शब्द मोजणे, duplicates काढणे आणि नावाने शोधणे एका pass मध्ये होते, म्हणूनच dict आणि set सगळीकडे दिसतात.

🚀 पुढे

वाईट hash सर्वांना एकाच box मध्ये टाकतो आणि O(n) परत येतो, म्हणून खऱ्या systems चांगले hash निवडून load factor पाहतात.

🧪 Try it here — एक नाव लावा — ते कोणत्या कप्प्यात पडते आणि कप्पे कधी दुप्पट होतात ते पहा

संपूर्ण धडा 05 वाचा →

6 🪆 Recursion

मुख्याध्यापक उपमुख्याध्यापकांना विचारतात, ते शिक्षकांना — base case, एक लहान प्रश्न, call stack; फळ्याशिवाय fib का फुटते.

🧒 सोप्या शब्दांत

मुख्याध्यापकांना 5! हवा, ते उपमुख्याध्यापकांना 4! विचारतात, ते एका शिक्षकांना 3!, असे 1! = 1 पर्यंत, जे सगळ्यांना माहीत आहे. मग उत्तरे परत वर जातात: 1, 2, 6, 24, 120. हेच recursion: त्याच प्रश्नाची छोटी आवृत्ती विचारून काम सोडवणे. पण उत्तरे लिहायला फळा नसेल तर fib तेच प्रश्न पुन्हा पुन्हा विचारतो.

📖 नवे शब्दrecursion — स्वतःलाच छोटा प्रश्न विचारून problem सोडवणारे functionbase case — लगेच उत्तर देता येईल एवढा छोटा प्रश्न, जिथे विचारणे थांबतेcall stack — अजून उत्तराची वाट पाहणाऱ्या प्रश्नांचा ढीगmemoisation — उत्तरे फळ्यावर लिहिणे, म्हणजे एकच गणित दोनदा करावे लागत नाही
1🪆 5! — मुख्याध्यापक उपमुख्याध्यापकांना विचारतात, ते …5!4!3!2!1! = 1विचारतो →← उत्तरे246215! = 120 ✓प्रत्येक जण लहान प्रश्न विचारतो; base caseआधी उत्तर देतो; उत्तरे वर परत जातात2📚 call stack — पाच प्रश्न वाट पाहतfact(5)fact(4)fact(3)fact(2)fact(1) → उत्तर देतोय← वर← तळmemory च्या पाच frames1,000 खोल → RecursionErrorखोल कामासाठी: loop, किंवातुमचा स्वतःचा stack (धडा 04)3💣 फळ्याशिवाय fib(5) — तेच प्रश्न, पुन्हा पुन्हाfib(5)fib(4)fib(3)fib(3)fib(2)fib(2)fib(1)fib(2)fib(1)fib(1)fib(0)fib(1)fib(0)fib(3) 2× विचारलाfib(2) 3× विचारलाfib(25): 242,785 प्रश्नफळ्यासह (धडा 11): 49खर्च loop चा नाही, झाडाचा आहे
⏪ आधी

काही प्रश्न, जसे 5!, हे त्याच प्रश्नाचे लहान रूप असतात, आणि त्यांना हाताने loop म्हणून लिहिणे अवघड होते.

💡 काय

recursion म्हणजे function जो base case पर्यंत पोहोचेपर्यंत स्वतःलाच लहान प्रश्न विचारून उत्तर देतो.

⚙️ कसे

fact(5) fact(4) ला विचारतो, असे 1! = 1 पर्यंत; पाच frames call stack वर थांबतात आणि उत्तरे 120 पर्यंत वर परत येतात.

🎯 का

stack depth आणि पुन्हा पुन्हा होणारे काम लक्षात ठेवले तर tree आणि divide-and-conquer code छोटा आणि स्पष्ट होतो.

🚀 पुढे

board शिवाय fib हा fib(3) वगैरे पुन्हा विचारतो; हाच अपव्यय lesson 11 मधले dynamic programming काढून टाकते.

🧪 Try it here — fib(n) किती प्रश्न विचारतो — फळ्यासह आणि त्याशिवाय?

संपूर्ण धडा 06 वाचा →

7 📶 Sorting

वर्गाची उंचीनुसार रांग — bubble आणि insertion (n²), merge आणि quick (n log n), stability, आणि तुम्ही sorted() का बोलावता.

🧒 सोप्या शब्दांत

वर्गाला उंचीप्रमाणे रांगेत उभे करा. शेजाऱ्यांची पुन्हा पुन्हा अदलाबदल करणे चालते, पण 2,000 विद्यार्थ्यांसाठी सुमारे 20 लाख तुलना लागतात. merge sort वर्गाचे अर्धे भाग करतो, प्रत्येक भाग क्रमाने लावतो, मग दोन क्रमाने लावलेल्या रांगा एकत्र गुंफतो, खूप कमी तुलनांत. sorting महत्त्वाचे कारण क्रमाने लावलेल्या list मध्ये शोधणे आणि गट करणे जलद होते.

📖 नवे शब्दbubble sort — सर्वात उंच शेवटी जाईपर्यंत शेजाऱ्यांची अदलाबदल: O(n²)merge sort — अर्धे करा, क्रमाने लावा, पुन्हा गुंफा: O(n log n)stable — समान उंचीचे विद्यार्थी आपला मूळ क्रम टिकवतातsorted() — Python चे तयार sort: जलद, stable, तेच वापरा
1✂️ merge sort — अर्धे करा, मग दोन क्रमबद्ध रांगा मिळवा528193528193528193528193258193258139123589विभाजनमिळवणेविभाजन: log n पातळ्या · मिळवणे: प्रत्येक पातळीला n काम → नेहमी n log n · O(n) जास्तीची जागा लागते2🫧 bubble sort — शेजारी अदलाबदल5281935 > 2 → अदलाबदल251839फेरी 1 नंतर: सगळ्यात उंच शेवटी पोहोचलाn फेऱ्या × n तुलना → n² · insertion: जवळजवळ क्रमात असेल तर O(n)3📊 त्याच 2,000 विद्यार्थ्यांवर तुलनाbubble1,997,047insertion985,773मिळवणे19,384quick13,248n² विरुद्ध n log n — n = 2,000 वर 100 पट, मोजलेले
⏪ आधी

शेजारी अदलाबदल करून 2,000 विद्यार्थी रांगेत लावायला सुमारे वीस लाख तुलना लागतात, आणि n दुप्पट झाला की चारपट.

💡 काय

sorting म्हणजे items क्रमाने लावणे; bubble आणि insertion sort O(n²) आहेत, तर merge sort आणि quicksort O(n log n).

⚙️ कसे

merge sort रांग log n levels पर्यंत अर्धी करतो, मग प्रत्येक level वर n काम करून sorted अर्धे जोडतो: n log n.

🎯 का

sorted data मुळे binary search आणि सोपे grouping शक्य होते, आणि stability समजली तर equal keys चा क्रम टिकतो का ते कळते.

🚀 पुढे

खऱ्या code मध्ये तुम्ही sorted() वापरता, जो stable n log n sort आहे, आणि तुमची मेहनत योग्य key निवडण्यात जाते.

🧪 Try it here — 12 विद्यार्थ्यांची उंचीनुसार रांग चार प्रकारे लावा आणि तुलना मोजा

संपूर्ण धडा 07 वाचा →

8 🔍 Binary search

क्रमाने लावलेली नोंदवही — मधोमध उघडा, अर्धी फेकून द्या, 50,000 नावांसाठी जास्तीत जास्त 16 नजरा; उत्तरावर search.

🧒 सोप्या शब्दांत

क्रमाने लावलेल्या हजेरीपटात नाव शोधायला तो मध्यभागी उघडा. नाव आधी येत असेल तर मागचा अर्धा भाग बाजूला टाका; नंतर येत असेल तर पुढचा. असे अर्धे करत राहिले तर 50,000 नावांसाठीही जास्तीत जास्त 16 वेळा पाहावे लागते. हे फक्त हजेरीपट क्रमाने लावलेला असल्यामुळेच चालते.

📖 नवे शब्दbinary search — क्रमाने लावलेली list पुन्हा पुन्हा अर्धी करून शोधणेmid — प्रत्येक वेळी तपासायचा मधला itemO(log n) — list दुप्पट, फक्त एकदा जास्त पाहणेsorted — क्रमाने लावलेले; त्याशिवाय अर्धे करणे चालत नाही
1🔍 37 साठी binary search — मधोमध उघडा, अर्धे फेकून द्या3712182531374250586371808895नजर 1mid = 42 · 37 < 42 → डावा अर्धा ठेवा3712182531374250586371808895नजर 2mid = 18 · 37 > 18 → 25 … 37 ठेवा3712182531374250586371808895नजर 3mid = 31 · 37 > 31 → फक्त 37 उरला3712182531374250586371808895नजर 4index 6 वर सापडला — 15 नावांसाठी 4 नजरा50,000 नावे → जास्तीत जास्त 16 नजरा · दहा लाख → 20 · नोंदवही आधी क्रमात हवी (एकदा sort: n log n)2📐 अर्धे करत — 50,000 नावे, 16 नजरा50,00025,00012,500… → 1प्रत्येक नजर उरलेले अर्धे करते: log₂ 50,000 ≈ 15.63🎯 उत्तरावर search — बसणारा सगळ्यात लहान लॉकर30✗60✗90✓120✓150✓180✓210✓240✓✗ ✗ ✓ ✓ … पलटतो तिथेच उत्तर → 90 kg (आकारांवर binary search)
⏪ आधी

register मध्ये एकेक ओळ वाचून नाव शोधले तर 50,000 नावांसाठी 50,000 पर्यंत looks लागतात.

💡 काय

binary search sorted list मध्ये मध्य उघडून दर वेळी अर्धा भाग टाकून item शोधतो: O(log n).

⚙️ कसे

37 शोधताना: mid 42 डावा भाग ठेवतो, mid 18 मुळे 25 ते 37, mid 31 नंतर फक्त 37 उरतो; 4 looks मध्ये index 6.

🎯 का

register sorted ठेवले तर 50,000 नावांसाठी जास्तीत जास्त 16 looks आणि दहा लाखांसाठी फक्त 20.

🚀 पुढे

हीच अर्धे करण्याची कल्पना थेट उत्तरावर search करू देते, आणि lesson 9 मधल्या balanced trees मध्येही तीच आहे.

🧪 Try it here — एक लक्ष्य निवडा आणि अर्धे-अर्धे करत जा

संपूर्ण धडा 08 वाचा →

9 🌳 Trees & heaps

कॅटलॉगचा खण आणि व्यासपीठ — BST insert आणि search, in-order चाल, balance का महत्त्वाचा; heap सगळ्यात लहान वर ठेवतो.

🧒 सोप्या शब्दांत

ग्रंथालयाच्या catalogue drawer मध्ये लहान क्रमांक डावीकडे आणि मोठे उजवीकडे जातात, म्हणून प्रत्येक वेळी पाहताना उरलेल्यापैकी अर्धे वगळले जाते. पण आधीच क्रमाने असलेली cards जोडली तर tree एक लांब रांग बनते आणि वेग जातो, म्हणून ते balanced राहायला हवे. heap म्हणजे podium: सर्वात लहान नेहमी वर, आधी उचलायला तयार.

📖 नवे शब्दBST — लहान डावीकडे आणि मोठे उजवीकडे जाणारे treeheight — किती पातळ्या खोल; कमी पातळ्या म्हणजे कमी वेळा पाहणेbalanced — फांद्या पसरलेले ठेवलेले, म्हणून height सुमारे log n राहतेheap — सर्वात लहान नेहमी वर ठेवणारे tree
1🌳 BST — कॅटलॉगचा खण: लहान डावीकडे, मोठे उजवीकडे5025751237628761837 < 50: डावीकडे37 > 25: उजवीकडेsearch(37): 3 नजरा = उंचीin-order चाल → 6 12 18 25 37 50 62 75 87: फुकटात क्रमबद्ध2🏆 heap — व्यासपीठ: सगळ्यात लहान नेहमी वर10203040255015push 15: 15 < 30 → वर अदलाबदल100201302403254505156array मध्ये:i ची मुले:2i+1 आणि 2i+23⚠️ 1 … 7 क्रमाने घातले — वेषातली list1234567उंची 7 = n → search O(n)4261357balanced: उंची 3 = log nAVL / red-black trees balanced राहण्यासाठीफिरतात; B-trees हेच disk वर करतात
⏪ आधी

sorted array मध्ये शोध जलद पण प्रत्येक insert मध्ये items सरकतात, आणि साध्या list मध्ये सर्वात लहान शोधायला सर्व वाचावे लागते.

💡 काय

BST लहान keys डावीकडे आणि मोठ्या उजवीकडे ठेवतो; heap हा tree नेहमी सर्वात लहान value वर ठेवतो.

⚙️ कसे

search(37): 50 वरून डावीकडे, 25 वरून उजवीकडे, 3 looks मध्ये सापडले; array मधल्या heap मध्ये i ची मुले 2i+1 आणि 2i+2 वर.

🎯 का

balanced trees O(log n) search आणि insert तसेच मोफत sorted walk देतात, आणि heap पुढचा सर्वात लहान पटकन देतो.

🚀 पुढे

1 ते 7 क्रमाने घातले तर height 7 ची list बनते, म्हणून खऱ्या systems AVL सारखे self-balancing trees वापरतात.

🧪 Try it here — keys घाला आणि खण वाढताना पहा — किंवा list होताना

संपूर्ण धडा 09 वाचा →

10 🗺️ Graphs

कॉरिडॉरचा नकाशा — adjacency lists, BFS hops ने पसरतो, DFS एक कॉरिडॉर धरतो, Dijkstra मोजतो, cycles.

🧒 सोप्या शब्दांत

शाळेचा नकाशा म्हणजे corridors ने जोडलेल्या खोल्या. gym पर्यंत सर्वात कमी corridors शोधायला office पासून एकेक फेरी बाहेर पसरा (BFS). सर्वात कमी मीटर शोधायला अजून निश्चित न झालेली सर्वात जवळची खोली निवडत राहा (Dijkstra). दोन्ही वेगळे उत्तर देऊ शकतात: lab मार्गे gym 65 m, पण library मार्गे 90 m.

📖 नवे शब्दgraph — links (edges) ने जोडलेली ठिकाणे (nodes)adjacency list — प्रत्येक खोली आपले शेजारी लिहून ठेवतेBFS — फेरी-फेरीने शोधा, म्हणून सर्वात कमी hops आधी मिळतातDFS — एक corridor शेवटपर्यंत जा, मग परत याDijkstra — corridors ना लांबी असताना सर्वात कमी एकूण अंतर शोधतो
1🗺️ कॉरिडॉरचा नकाशा — सहा खोल्या, लांबी असलेले कॉरिडॉर203010601540office00 mhall120 mlab250 mlibrary230 mgym365 mfield4105 m1office पासून hops (BFS)20 moffice पासून मीटर (Dijkstra)gym पर्यंत: lab मार्गे 65 m — library मार्गे 90 m नाहीसगळ्यात कमी hops आणि सगळ्यात कमी मीटर वेगळे असू शकतात2📋 adjacency list — प्रत्येक खोली आपले शेजारी सांगतेofficehall 20halloffice 20lab 30library 10labhall 30gym 15libraryhall 10gym 60gymlab 15library 60field 40fieldgym 40O(V + E) memory · अख्खा नकाशा म्हणजे या सहा ओळी3🌊 BFS hops ने पसरतो · 🧗 DFS एक कॉरिडॉर धरतोBFS — queue: जवळच्या खोल्या आधीofficehop 0hallhop 1labhop 2libraryhop 2gymhop 3fieldhop 4DFS — stack: एक कॉरिडॉर शेवटपर्यंत, मग मागेofficehalllabgymlibraryfieldदोन्ही O(V + E) · visited खूण करा नाहीतर कायम फिरत रहालDijkstra = queue ऐवजी अंतरांचा heap असलेला BFS
⏪ आधी

rooms आणि corridors एका रांगेत किंवा tree मध्ये बसत नाहीत, म्हणून graphs शिवाय gym कडे सर्वात छोटा रस्ता विचारताही येत नाही.

💡 काय

graph म्हणजे corridors (edges) ने जोडलेल्या rooms (vertices) चा संच, जो neighbours च्या adjacency list मध्ये साठवला जातो.

⚙️ कसे

BFS hops ने पसरतो, DFS एक corridor खोलवर पकडतो, आणि Dijkstra metres मोजून office ते gym चा 65 m रस्ता शोधतो.

🎯 का

सर्वात कमी hops आणि सर्वात कमी metres वेगळे असू शकतात, म्हणून BFS आणि Dijkstra मधला फरक कळला तर नेमक्या प्रश्नाचे उत्तर मिळते.

🚀 पुढे

maps, networks, build systems आणि friend lists हे सर्व graphs आहेत, म्हणून हे walks खऱ्या software मध्ये सगळीकडे दिसतात.

🧪 Try it here — कॉरिडॉरचा नकाशा तीन प्रकारे चाला, एका वेळी एक पाऊल

संपूर्ण धडा 10 वाचा →

11 🧠 Dynamic programming & greedy

फळ्यावरची उत्तरे — memoisation आणि tabulation (पायऱ्या, नाणी); greedy: आधी संपणारी meeting घ्या.

🧒 सोप्या शब्दांत

एका वेळी 1 किंवा 2 पायऱ्या चढत 8 पायऱ्या किती प्रकारे चढता येतील? खालून सुरू करा आणि प्रत्येक उत्तर फळ्यावर लिहा: प्रत्येक नवे उत्तर म्हणजे आधीच्या दोनांची बेरीज, म्हणून काहीच दोनदा मोजावे लागत नाही. greedy म्हणजे आत्ता सर्वात चांगला दिसणारा पर्याय घेणे; आधी संपणारी meeting निवडताना ते चालते, पण 1, 3, 4 च्या coins ने 6 बनवताना चुकते.

📖 नवे शब्दdynamic programming — छोटे भाग एकदाच सोडवा, लिहून ठेवा, त्यांतून मोठे उत्तर बनवाmemoisation — काहीही मोजण्याआधी उत्तरांचा फळा तपासाtabulation — सर्वात छोट्या case पासून वर, क्रमाने फळा भराgreedy — मागे न पाहता नेहमी आत्ताचा सर्वात चांगला दिसणारा पर्याय घ्या
1🧠 stairs(n) — फळा तळापासून वर भराn012345678मार्ग112358132134s(5) = s(4) + s(3) = 5 + 3प्रत्येक कप्पा: एकदा लिहिला, दोनदा वाचला → O(n)2🪙 नाणी [1, 3, 4] ने 6 — DP विरुद्ध greedyरक्कम012345678best012112222best[6] = 2 नाणी (3 + 3) ✓greedy: 4 + 1 + 1 = 3 नाणी ✗ — आधी मोठे म्हणजे पुरावा नव्हे3🏃 greedy — एक खोली, जास्तीत जास्त club meetings: आधी संपणारी घ्या9:0010:0011:0012:0013:00बुद्धिबळ✓ घेतलीनाटक✗ मागच्या निवडीवर येतेcoding✓ घेतलीband✗ मागच्या निवडीवर येतेचित्रकला✓ घेतलीसंपण्याच्या वेळेनुसार क्रमात → मागची निवड संपल्यावर सुरू होत असेल तर घ्या
⏪ आधी

साधे recursion तेच छोटे प्रश्न पुन्हा पुन्हा सोडवते, म्हणून stairs(n) किंवा fib(n) exponentially वाढतो.

💡 काय

dynamic programming प्रत्येक छोटे उत्तर board वर एकदाच लिहून पुन्हा वापरते; greedy आत्ता सर्वात चांगली दिसणारी पायरी घेतो.

⚙️ कसे

board खालून वर भरा: s(5) = s(4) + s(3) = 5 + 3, प्रत्येक cell एकदाच लिहिली जाते, म्हणून stairs O(n) होतो.

🎯 का

coins [1, 3, 4] ने 6 बनवताना DP 2 coins (3 + 3) शोधते, greedy 4 + 1 + 1 घेतो; म्हणून greedy कधी सुरक्षित ते कळते.

🚀 पुढे

board ची ही विचारपद्धत diff tools, route planners आणि schedulers चालवते, आणि लवकर संपणारी meeting सारखा greedy सिद्ध झाल्यावर जिंकतो.

🧪 Try it here — पायऱ्यांचा फळा भरा, मग नाण्यांवर DP आणि greedy ला लढू द्या

संपूर्ण धडा 11 वाचा →

12 🎯 योग्य structure निवडणे

प्रश्न ठरवतो — complexity cheat sheet, निर्णय तक्ता, मुलाखतीची पद्धत, आणि कळस-प्रकल्प.

🧒 सोप्या शब्दांत

काहीही बनवण्याआधी प्रश्न मोठ्याने बोला. '5 वा विद्यार्थी दे' म्हणजे array; 'नावाने शोध' म्हणजे hash map; 'पुढचा सर्वात लहान कोण' म्हणजे heap; 'खोल्या आणि corridors' म्हणजे graph. प्रश्नच structure निवडतो, आणि योग्य structure हळू कामाला जलद बनवते.

📖 नवे शब्दdata structure — ठरावीक प्रश्न जलद सुटावेत अशी data ची मांडणीtrade-off — प्रत्येक structure काही कामांत जलद, काहींत हळूbrute force — आधी लिहिलेले, सगळे करून पाहणारे साधे उत्तरpattern — problem ज्याला जुळते ती ओळखीची युक्ती (window, two pointers, BFS…)
1🎯 प्रश्न ठरवतो — मोठ्याने बोला, structure उत्तर देतेप्रश्न कायविचारतो?i-वीगोष्ट?ARRAYO(1)नावा-नुसार?HASH MAPO(1) सरासरीसगळ्यात अलीकडचेआधी?STACKO(1)आधी आलेला,आधी सेवा?QUEUEO(1)सगळ्यात लहानपुढे?HEAPO(log n)क्रमबद्ध, आणिबदलते?BSTO(log n)खोल्या आणिकॉरिडॉर?GRAPHO(V+E)तोच प्रश्नपुन्हा?DP BOARDO(n·m)आधी brute force, मग pattern ला नाव — हा तक्ताच मुलाखतीची पद्धत2📚 प्रकाररेषीयarray · linked liststack · queuehash-आधारितdict · setश्रेणीबद्धBST · heap · trieजाळेgraphतक्ताDP फळा · matrix
⏪ आधी

दहा structures माहीत असूनही नवीन प्रश्नासमोर कोणता हवा हे ओळखता आले नाही तर उपयोग नाही.

💡 काय

प्रश्न काय विचारतो आणि कोणता structure त्याचे उत्तर देतो, त्याच्या Big-O खर्चासह, हे जोडणारे decision table.

⚙️ कसे

i-th गोष्ट म्हणजे array O(1), नावाने म्हणजे hash map O(1) avg, पुढचा लहान म्हणजे heap O(log n), rooms म्हणजे graph O(V+E).

🎯 का

प्रश्न मोठ्याने बोला आणि structure स्वतः उत्तर देतो; हीच पद्धत coding interviews मध्येही कामी येते.

🚀 पुढे

आधी brute force लिहा, मग pattern ओळखा; capstone आणि प्रत्येक खरा design review याच सवयीने चालतो.

🧪 Try it here — सहा प्रश्न — structure निवडा

संपूर्ण धडा 12 वाचा →