<!--
TEMPLATE: Data Structure Problem Note (এই file টা একটা template — সরাসরি এটায় লিখো না)

- এটা data-structure problem-এর জন্য note-এর template।
- প্রথমে এই file টা copy করো, তারপর সংশ্লিষ্ট topic-এর `problems/` ফোল্ডারে
  `NNN-title.md` নামে রাখো (যেমন: `012-valid-parentheses.md`)।
- নিচের প্রতিটা section নিজের ভাষায় পূরণ করো — কোনো section ফাঁকা রেখো না।
- মূল লক্ষ্য: উত্তর মুখস্থ করা নয়, **কীভাবে ভাবতে হয়** সেটা শেখা। তাই কোন data structure
  কেন লাগছে, intuition আর "thinking tweak" section গুলোতে বেশি সময় দাও।
- note লেখা শেষ হলে এই comment block-টা মুছে দিতে পারো।
-->

# NNN — Problem Title

> উপরের H1-এ problem-এর number আর নাম বসাও (file-এর নামের সাথে মিল রেখে), যেমন: `# 012 — Valid Parentheses`। তারপর এই হিন্ট লাইনটা মুছে দাও।

<div class="problem-source" markdown="1">

<p class="source-label" id="source">Problem link ও উৎস</p>

> Attribution-এর জন্য এই block। শুধু official link এখানে রাখো — problem statement কখনো copy কোরো না।

- **Original source:** মূল উৎসের নাম (যেমন: Classic exercise / নিজের বানানো / বই-এর নাম)
- **Platform:** কোন judge বা site + link (যেমন: LeetCode — <https://leetcode.com/problems/...>; না থাকলে `—`)
- **Topic:** কোন data structure / topic (যেমন: stack, hash map, linked list)
- **Difficulty:** Easy / Medium / Hard (নিজের ধারণা মতো)
- **Pattern:** এক লাইনে pattern-এর নাম (যেমন: monotonic stack, two pointers)
- **Basic idea inherited from:** কোন আগের problem/idea থেকে এসেছে (যেমন: 008 — Two Sum; একদম নতুন হলে `—`)

</div>

## প্রশ্ন ও উদাহরণ {#problem}

### সহজ করে প্রশ্ন {#1-problem-in-simple-words}

> Problem-টা একদম সহজ বাংলায়, নিজের ভাষায় বুঝিয়ে লেখো — যেন একজন বন্ধুকে বোঝাচ্ছ। Original statement copy কোরো না।

### Input ও output {#8-example-input-and-output}

> অন্তত একটা concrete input আর তার expected output দাও। কোনো edge case থাকলে (খালি input, একটা element, সব একরকম) সেটাও আলাদা করে দাও।

### চেনা উদাহরণে বোঝা {#6-real-life-analogy}

> বাস্তব জীবনের একটা উদাহরণ দিয়ে intuition তৈরি করো (যেমন: stack = থালার স্তূপ, queue = লাইন ধরে দাঁড়ানো)।

## ভিত্তির ধারণা {#idea}

### আগের কোন ধারণাটি লাগবে {#2-which-basic-idea-does-this-inherit-from}

> এই problem কোন আগের বা সহজ idea/problem-এর উপর দাঁড়িয়ে আছে? Source block-এর "Basic idea inherited from" এখানে একটু বিস্তারিত বুঝিয়ে বলো।

### ভেতরের যুক্তি {#3-what-is-the-hidden-math-or-logic}

> এর ভেতরে লুকিয়ে থাকা math বা logic-টা কী, বের করে লেখো (যেমন: prefix sum, frequency count, কোনো invariant যেটা সবসময় ঠিক থাকে)।

### কী দিয়ে তথ্য রাখব {#4-which-data-structure-is-needed}

> কোন data structure লাগবে আর কেন সেটা প্রথমেই মাথায় এল, লেখো (যেমন: hash map, stack, heap, queue)।

### এটি কেন উপযুক্ত {#5-why-this-data-structure-fits}

> ওই data structure-টা কেন এই problem-এ পুরোপুরি খাপ খায় বুঝিয়ে বলো — কোন operation-টা এটা O(1) বা fast করে দেয়, যেটা ছাড়া সমাধান ধীর হতো।

## ধাপে ধাপে সমাধান {#walkthrough}

### প্রথম সরল উপায় {#9-brute-force-thinking}

> প্রথমে মাথায় আসা সহজ, সরাসরি সমাধানটা লেখো — efficient না হলেও চলবে। আগে "কোনোভাবে হলেও হয়" version-টা লিখে ফেলো।

### কোথায় বেশি কাজ হচ্ছে {#10-why-brute-force-is-slow}

> ওই brute force কেন ধীর বুঝিয়ে বলো — কোথায় বারবার একই কাজ হচ্ছে, বা কোথায় nested loop লেগে O(n^2)/আরও বেশি হয়ে যাচ্ছে।

### যে বিষয়টি খেয়াল করতে হবে {#11-key-observation}

> যে একটা observation পুরো problem-টা সহজ করে দেয় সেটা ধরো — এটাই solution-এর চাবি (যেমন: "সবসময় শেষ খোলা bracket-টাই আগে বন্ধ হয়")।

### আরও কম কাজে সমাধান {#12-optimized-intuition}

> Key observation কাজে লাগিয়ে efficient approach-টা intuition level-এ বোঝাও — code নয়, ভাবনাটা আগে পরিষ্কার করো।

### ভাবনার পরিবর্তন {#13-thinking-tweak}

> ছোট্ট কোন চিন্তার মোচড় brute force থেকে optimal-এ নিয়ে গেল? এক লাইনের সেই "aha" মুহূর্তটা ধরো — এটাই note-এর প্রাণ।

### ছবিতে বোঝা {#7-visual-explanation}

> ছবি এঁকে দেখাও data structure-টা step by step কীভাবে বদলায়। নিচের fence-এ ASCII diagram আঁকো (নিজের example দিয়ে replace করো)।

```text
push 'a'   ->  | a |
push 'b'   ->  | a | b |
pop        ->  | a |          (b বেরিয়ে গেল, LIFO)
```

### ছোট input-এ ধাপে ধাপে {#14-step-by-step-dry-run}

> একটা ছোট input নিয়ে হাতে হাতে চালাও — প্রতিটা step-এ data structure-এর ভেতরে কী থাকছে লেখো। নিচের মতো step list বানাও:

1. শুরুর অবস্থা: data structure খালি, কোন variable-এ কী আছে
2. Step 1: কোন element process হলো, structure-এ কী যোগ/বাদ হলো
3. Step 2: কী হলো
4. শেষ অবস্থা: final answer কীভাবে এল

## কোড ও ব্যাখ্যা {#code}

### Python {#15-python-solution}

> পরিষ্কার, পড়ার মতো Python code লেখো। Comment কম রাখো, variable name অর্থপূর্ণ রাখো। নিচের fence-এ লেখো:

```python

```

### কোডের প্রতিটি অংশ {#16-line-by-line-code-explanation}

> Code-এর প্রতিটা গুরুত্বপূর্ণ লাইন বাংলায় বুঝিয়ে বলো — কেন ওই লাইন আছে আর কী করছে।

### Output মিলিয়ে দেখা {#17-output-walkthrough}

> Section 8-এর example দিয়ে code চালালে step by step কী output আসবে দেখাও — যেন কেউ code না চালিয়েও বুঝতে পারে।

## খরচ ও সাধারণ ভুল {#cost}

### সময় {#18-time-complexity}

> Big-O-তে time complexity লেখো আর এক লাইনে কেন সেটা বুঝিয়ে দাও (যেমন: O(n) — প্রতিটা element একবার করে push/pop হয়)।

### অতিরিক্ত জায়গা {#19-space-complexity}

> কত extra memory লাগছে? O(1)? O(n)? এক লাইনে কারণসহ লেখো (data structure-এ কত element জমতে পারে ভাবো)।

### যে ভুলগুলো এড়াতে হবে {#20-common-mistakes}

> এই ধরনের problem-এ যেসব ভুল প্রায়ই হয় bullet করে লেখো (খালি input, edge case, ভুল data structure বেছে নেওয়া, ইত্যাদি):

- এখানে প্রথম common ভুলটা লেখো
- এখানে দ্বিতীয়টা লেখো

## শেখা ও পরের অনুশীলন {#practice}

### ভিত্তির সঙ্গে সম্পর্ক {#21-which-basic-problem-this-inherits-from}

> এর ভিত্তি কোন সহজ problem? নাম + (থাকলে) সেই note-এর link দাও — আটকে গেলে আগে সেটা আবার দেখবে, অর্ধেক উত্তর সেখানেই থাকে।

### পরের অনুশীলন {#22-similar-harder-problems}

> একই idea-র আরও কঠিন problem গুলোর নাম + official link দাও (statement copy কোরো না)।

### কৌশলটি মনে রাখুন {#23-pattern-learned}

> এই problem থেকে যে reusable pattern শিখলে সেটা এক লাইনে নাম দিয়ে লেখো — পরে একই ধরনের problem-এ দ্রুত মনে পড়বে।

### নিজেকে যাচাই করুন {#24-final-summary}

> "ভবিষ্যতের আমাকে এক-দুই লাইনে কী বলব" — মূল insight কী, আর কোন signal দেখলে এই data structure/pattern মনে পড়বে, সেটা লেখো।

---

> **মনে রাখার নিয়ম (legal):** সব নিজের ভাষায় লেখো; problem statement copy কোরো না; official link শুধু attribution-এর জন্য রাখো; "asked by Google/Amazon" এমন দাবি কোরো না — বরং "Google-style pattern" / "common interview pattern" লেখো।
