NNN — Problem Title¶
উপরের H1-এ problem-এর number আর নাম বসাও (file-এর নামের সাথে মিল রেখে), যেমন:
# 012 — Valid Parentheses। তারপর এই হিন্ট লাইনটা মুছে দাও।
Problem link ও উৎস
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; একদম নতুন হলে
—)
প্রশ্ন ও উদাহরণ¶
সহজ করে প্রশ্ন¶
Problem-টা একদম সহজ বাংলায়, নিজের ভাষায় বুঝিয়ে লেখো — যেন একজন বন্ধুকে বোঝাচ্ছ। Original statement copy কোরো না।
Input ও output¶
অন্তত একটা concrete input আর তার expected output দাও। কোনো edge case থাকলে (খালি input, একটা element, সব একরকম) সেটাও আলাদা করে দাও।
চেনা উদাহরণে বোঝা¶
বাস্তব জীবনের একটা উদাহরণ দিয়ে intuition তৈরি করো (যেমন: stack = থালার স্তূপ, queue = লাইন ধরে দাঁড়ানো)।
ভিত্তির ধারণা¶
আগের কোন ধারণাটি লাগবে¶
এই problem কোন আগের বা সহজ idea/problem-এর উপর দাঁড়িয়ে আছে? Source block-এর "Basic idea inherited from" এখানে একটু বিস্তারিত বুঝিয়ে বলো।
ভেতরের যুক্তি¶
এর ভেতরে লুকিয়ে থাকা math বা logic-টা কী, বের করে লেখো (যেমন: prefix sum, frequency count, কোনো invariant যেটা সবসময় ঠিক থাকে)।
কী দিয়ে তথ্য রাখব¶
কোন data structure লাগবে আর কেন সেটা প্রথমেই মাথায় এল, লেখো (যেমন: hash map, stack, heap, queue)।
এটি কেন উপযুক্ত¶
ওই data structure-টা কেন এই problem-এ পুরোপুরি খাপ খায় বুঝিয়ে বলো — কোন operation-টা এটা O(1) বা fast করে দেয়, যেটা ছাড়া সমাধান ধীর হতো।
ধাপে ধাপে সমাধান¶
প্রথম সরল উপায়¶
প্রথমে মাথায় আসা সহজ, সরাসরি সমাধানটা লেখো — efficient না হলেও চলবে। আগে "কোনোভাবে হলেও হয়" version-টা লিখে ফেলো।
কোথায় বেশি কাজ হচ্ছে¶
ওই brute force কেন ধীর বুঝিয়ে বলো — কোথায় বারবার একই কাজ হচ্ছে, বা কোথায় nested loop লেগে O(n^2)/আরও বেশি হয়ে যাচ্ছে।
যে বিষয়টি খেয়াল করতে হবে¶
যে একটা observation পুরো problem-টা সহজ করে দেয় সেটা ধরো — এটাই solution-এর চাবি (যেমন: "সবসময় শেষ খোলা bracket-টাই আগে বন্ধ হয়")।
আরও কম কাজে সমাধান¶
Key observation কাজে লাগিয়ে efficient approach-টা intuition level-এ বোঝাও — code নয়, ভাবনাটা আগে পরিষ্কার করো।
ভাবনার পরিবর্তন¶
ছোট্ট কোন চিন্তার মোচড় brute force থেকে optimal-এ নিয়ে গেল? এক লাইনের সেই "aha" মুহূর্তটা ধরো — এটাই note-এর প্রাণ।
ছবিতে বোঝা¶
ছবি এঁকে দেখাও data structure-টা step by step কীভাবে বদলায়। নিচের fence-এ ASCII diagram আঁকো (নিজের example দিয়ে replace করো)।
ছোট input-এ ধাপে ধাপে¶
একটা ছোট input নিয়ে হাতে হাতে চালাও — প্রতিটা step-এ data structure-এর ভেতরে কী থাকছে লেখো। নিচের মতো step list বানাও:
- শুরুর অবস্থা: data structure খালি, কোন variable-এ কী আছে
- Step 1: কোন element process হলো, structure-এ কী যোগ/বাদ হলো
- Step 2: কী হলো
- শেষ অবস্থা: final answer কীভাবে এল
কোড ও ব্যাখ্যা¶
Python¶
পরিষ্কার, পড়ার মতো Python code লেখো। Comment কম রাখো, variable name অর্থপূর্ণ রাখো। নিচের fence-এ লেখো:
কোডের প্রতিটি অংশ¶
Code-এর প্রতিটা গুরুত্বপূর্ণ লাইন বাংলায় বুঝিয়ে বলো — কেন ওই লাইন আছে আর কী করছে।
Output মিলিয়ে দেখা¶
Section 8-এর example দিয়ে code চালালে step by step কী output আসবে দেখাও — যেন কেউ code না চালিয়েও বুঝতে পারে।
খরচ ও সাধারণ ভুল¶
সময়¶
Big-O-তে time complexity লেখো আর এক লাইনে কেন সেটা বুঝিয়ে দাও (যেমন: O(n) — প্রতিটা element একবার করে push/pop হয়)।
অতিরিক্ত জায়গা¶
কত extra memory লাগছে? O(1)? O(n)? এক লাইনে কারণসহ লেখো (data structure-এ কত element জমতে পারে ভাবো)।
যে ভুলগুলো এড়াতে হবে¶
এই ধরনের problem-এ যেসব ভুল প্রায়ই হয় bullet করে লেখো (খালি input, edge case, ভুল data structure বেছে নেওয়া, ইত্যাদি):
- এখানে প্রথম common ভুলটা লেখো
- এখানে দ্বিতীয়টা লেখো
শেখা ও পরের অনুশীলন¶
ভিত্তির সঙ্গে সম্পর্ক¶
এর ভিত্তি কোন সহজ problem? নাম + (থাকলে) সেই note-এর link দাও — আটকে গেলে আগে সেটা আবার দেখবে, অর্ধেক উত্তর সেখানেই থাকে।
পরের অনুশীলন¶
একই idea-র আরও কঠিন problem গুলোর নাম + official link দাও (statement copy কোরো না)।
কৌশলটি মনে রাখুন¶
এই problem থেকে যে reusable pattern শিখলে সেটা এক লাইনে নাম দিয়ে লেখো — পরে একই ধরনের problem-এ দ্রুত মনে পড়বে।
নিজেকে যাচাই করুন¶
"ভবিষ্যতের আমাকে এক-দুই লাইনে কী বলব" — মূল insight কী, আর কোন signal দেখলে এই data structure/pattern মনে পড়বে, সেটা লেখো।
মনে রাখার নিয়ম (legal): সব নিজের ভাষায় লেখো; problem statement copy কোরো না; official link শুধু attribution-এর জন্য রাখো; "asked by Google/Amazon" এমন দাবি কোরো না — বরং "Google-style pattern" / "common interview pattern" লেখো।