সরাসরি প্রধান সামগ্রীতে চলে যান

হিস্টোগ্রামে সবথেকে বড় আয়তক্ষেত্র বা রেকট্যাঙ্গেল বের করার সহজ উপায়

সবাইকে স্বাগতম! আজকের এই আলোচনায় আমরা একটি দারুণ মজার এবং গুরুত্বপূর্ণ সমস্যা সমাধান করব। যার নাম হলো 'Largest Rectangle in Histogram'। এটি লিটকোড (LeetCode) এর একটি হার্ড লেভেলের সমস্যা (Problem #84)। আমরা শিখব কীভাবে ডেটা স্ট্রাকচার ব্যবহার করে খুব সহজে এবং কম সময়ে এই বড় আয়তক্ষেত্রটির ক্ষেত্রফল (Area) বের করা যায়।

সমস্যাটি কী? (Introduction)

হিস্তোগ্রাম হলো এক ধরণের গ্রাফ যেখানে অনেকগুলো বার (Bars) পাশাপাশি থাকে। আমাদের কাছে প্রতিটি বারের উচ্চতা (Height) দেওয়া থাকবে। আমাদের কাজ হলো এমন একটি আয়তক্ষেত্র বা রেকট্যাঙ্গেল খুঁজে বের করা যা এই হিস্তোগ্রামের ভেতরে তৈরি করা যায় এবং যার ক্ষেত্রফল হবে সবথেকে বেশি।

এখানে আমরা মূল ভিডিও রেফারেন্স হিসেবে ব্যবহার করছি: Largest Rectangle in Histogram | Best Solution & Code [00:22]


১. ব্রুট ফোর্স বনাম অপ্টিমাল সলিউশন (Approaches)

যেকোনো প্রবলেম সলভ করার দুটি উপায় থাকে।

  • ব্রুট ফোর্স (Brute Force): সব কয়টি সম্ভাব্য রেকট্যাঙ্গেল চেক করা। এতে সময় অনেক বেশি লাগে (O(n²))। [03:05]

  • অপ্টিমাল সলিউশন (Optimal Solution): আমরা এখানে Stack ডেটা স্ট্রাকচার ব্যবহার করব যাতে একবার লুপ চালিয়েই কাজ শেষ করা যায় (O(n))। [03:32]

সহজ ভাষায় ব্যাখ্যা:

  • ব্রুট ফোর্স: ধরুন একটি বড় বাজারের সব দোকান ঘুরে সেরা দাম খুঁজছেন। এতে সময় বেশি লাগে।

  • অপ্টিমাল (Stack): আপনার কাছে একটি স্মার্ট লিস্ট আছে যা দেখে আপনি মুহূর্তেই সিদ্ধান্ত নিতে পারছেন।


২. মূল আইডিয়া: প্রতিটি বারের জন্য সর্বোচ্চ এলাকা (The Logic)

ভিডিওতে শ্রদ্ধা আপু বুঝিয়েছেন যে, আমরা যদি ধরে নেই যে প্রতিটি বারকে (Bar) তার পুরো উচ্চতায় রেখে আমরা একটি রেকট্যাঙ্গেল বানাব, তবে সেই রেকট্যাঙ্গেলটি ডানে আর বামে কতদূর যেতে পারবে? [04:04]

একটি বার ডানে বা বামে ততক্ষণ পর্যন্ত বাড়তে পারে যতক্ষণ না সে নিজের চেয়ে ছোট কোনো বার পায়।

  • Left Smaller (L): বাম দিকে প্রথম ছোট বারের ইনডেক্স। [10:11]

  • Right Smaller (R): ডান দিকে প্রথম ছোট বারের ইনডেক্স। [10:11]

সূত্র (Formula): Width (চওড়া) = Right Smaller Index - Left Smaller Index - 1 Area (ক্ষেত্রফল) = Height * Width [11:04]


৩. স্ট্যাক ব্যবহার করে সমাধান (Using Stack)

আমাদের দুটি প্রধান কাজ করতে হবে: ১. Next Smaller Element (Right): ডানে ছোট বার খোঁজা। [12:31] ২. Previous Smaller Element (Left): বামে ছোট বার খোঁজা। [21:08]

সহজ ভাষায় 'Stack' কী? স্ট্যাক হলো অনেকটা থালার ওপর থালা সাজিয়ে রাখার মতো। আপনি সবশেষে যে থালাটি রাখবেন, সেটিই সবার আগে সরাতে পারবেন (LIFO - Last In First Out)।

ভিডিও রেফারেন্স: [18:19] (সুইডো কোড এবং লজিক)


৪. কোডিং অংশ (Coding Snippet)

নিচে C++ এ এই সমস্যার সমাধান দেওয়া হলো। কোডটি দেখলে বুঝতে পারবেন কীভাবে স্ট্যাক ব্যবহার করে ইনডেক্সগুলো খুঁজে বের করা হচ্ছে।

C++

#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>

using namespace std;

int largestRectangleArea(vector<int>& heights) {
    int n = heights.size();
    vector<int> left(n), right(n);
    stack<int> s;

    // ডান দিকের ছোট বারের ইনডেক্স বের করা (Right Smaller)
    for (int i = n - 1; i >= 0; i--) {
        while (!s.empty() && heights[s.top()] >= heights[i]) {
            s.pop();
        }
        if (s.empty()) right[i] = n; // যদি ছোট কিছু না থাকে, তবে বাউন্ডারি হবে n
        else right[i] = s.top();
        s.push(i);
    }

    // স্ট্যাক খালি করে বাম দিকের জন্য তৈরি করা
    while (!s.empty()) s.pop();

    // বাম দিকের ছোট বারের ইনডেক্স বের করা (Left Smaller)
    for (int i = 0; i < n; i++) {
        while (!s.empty() && heights[s.top()] >= heights[i]) {
            s.pop();
        }
        if (s.empty()) left[i] = -1; // যদি ছোট কিছু না থাকে, তবে বাউন্ডারি -1
        else left[i] = s.top();
        s.push(i);
    }

    int maxArea = 0;
    for (int i = 0; i < n; i++) {
        int width = right[i] - left[i] - 1;
        int area = heights[i] * width;
        maxArea = max(maxArea, area);
    }
    return maxArea;
} 

কোডটির কাজ:

  • প্রথম for লুপটি প্রতিটি বারের জন্য তার ঠিক ডান দিকে থাকা ছোট বারের অবস্থান খুঁজে বের করে। [25:13]

  • দ্বিতীয় for লুপটি বাম দিকের জন্য একই কাজ করে। [26:00]

  • সবশেষে, প্রতিটি বারের জন্য সম্ভাব্য ক্ষেত্রফল বের করে সবথেকে বড়টি (maxArea) রিটার্ন করা হয়। [27:15]


৫. আমার বিশ্লেষণ ও মতামত (Analysis and Thinking)

এই প্রবলেমটি সমাধানের মূল চাবিকাঠি হলো বাউন্ডারি বোঝা। অনেক সময় আমরা সরাসরি স্ট্যাকের কথা চিন্তা করি না, কিন্তু লজিক্যালি চিন্তা করলে দেখা যায় আমাদের শুধু ডানে আর বামে ছোট বারটি খুঁজে বের করতে হবে।

বাস্তব জীবনের উদাহরণ: ধরুন আপনি একটি ভিড়ের মধ্যে দাঁড়িয়ে আছেন এবং দুই হাত দুই দিকে প্রসারিত করতে চান। আপনি হাত ততদূরই নিতে পারবেন যতক্ষণ না আপনার চেয়ে লম্বা কেউ বা দেয়াল আপনার সামনে পড়ছে। এখানে বারগুলো হলো সেই দেয়াল।

বিকল্প উপায়: ভিডিওতে দেখানো হয়েছে আলাদা দুটি লুপ চালিয়ে বাম এবং ডানের ছোট ইনডেক্স বের করা। তবে একটি মাত্র লুপ এবং একটি স্ট্যাক ব্যবহার করেও এটি সমাধান করা সম্ভব, যাকে বলা হয় 'Single Pass' সলিউশন। তবে শেখার শুরুতে ভিডিওতে দেখানো পদ্ধতিটিই (Double Pass) সবথেকে সহজবোধ্য। [31:07]

পরামর্শ: কোডটি মুখস্থ না করে খাতায় কলমে 'Dry Run' করুন (মানে ইনপুট নিয়ে এক ধাপ এক ধাপ করে নিজে হিসেব করুন)। এতে কনসেপ্ট একদম পরিষ্কার হয়ে যাবে। [31:22]

[

Largest Rectangle in Histogram | Best Solution & Code

Shradha Khapra · 59K views

](http://www.youtube.com/watch?v=ysy1o-QEj3k)

মন্তব্যসমূহ

এই ব্লগটি থেকে জনপ্রিয় পোস্টগুলি

সিজ্জিন (Sijjin) vs ইল্লিয়িন (Illiyin) পার্থক্য Difference

Sijjin (سِجِّين) এবং Illiyin (عِلِّيِّين) —এ দুটি শব্দ কুরআনে এসেছে এবং দুটোই মানুষের আমলনামা সংরক্ষণ সম্পর্কিত স্থানকে নির্দেশ করে। ১. সিজ্জিন (Sijjin) সিজ্জিন হলো পাপীদের (কাফের, মুনাফিক ও দুরাচারীদের) আমলনামা সংরক্ষণের স্থান। এটি সাত তলদেশের নীচে এক কারাগার বা অন্ধকার জগতে অবস্থিত বলে উল্লেখ রয়েছে। সূরা আল-মুতাফফিফীন (৮৩:৭-৯) তে বলা হয়েছে: "كَلَّا إِنَّ كِتَابَ الْفُجَّارِ لَفِي سِجِّينٍ ۝ وَمَا أَدْرَاكَ مَا سِجِّينٌ ۝ كِتَابٌ مَرْقُومٌ" অর্থ: "না, পাপীদের আমলনামা সিজ্জিনে সংরক্ষিত। তুমি কি জানো, সিজ্জিন কী? এটি এক লিখিত দলিল।" সিজ্জিনকে একটি কারাগার, সংকীর্ণ স্থান, বা নিচের স্তরে অবস্থিত এক অন্ধকার দুনিয়া হিসেবে ব্যাখ্যা করা হয়। ২. ইল্লিয়িন (Illiyin) ইল্লিয়িন হলো সৎকর্মশীলদের (মুমিন ও নেককারদের) আমলনামা সংরক্ষণের স্থান । এটি সপ্তম আসমানের ওপরে সংরক্ষিত এক সম্মানিত স্থান। সূরা আল-মুতাফফিফীন (৮৩:১৮-২১) তে বলা হয়েছে: "كَلَّا إِنَّ كِتَابَ الْأَبْرَارِ لَفِي عِلِّيِّينَ ۝ وَمَا أَدْرَاكَ مَا عِلِّيُّونَ ۝ كِتَابٌ مَرْقُومٌ ۝ يَش...

তারাবিহ সমগ্র - প্রথম আলো

রামাদান ২০২৪ উপলক্ষে প্রথম আলোর নিয়মিত আয়োজন - খতমে তারাবিহ'র সূরা গুলো নিয়ে সংক্ষিপ্ত আলোচনা'র লিংক  নিচে দেওয়া হলো।  লিংকে ক্লিক করলেই আপনাকে আলোচনা তে নিয়ে যাবে। তারাবিহ: ১ | একটি খুন ও গাভি নিয়ে বনি ইসরাইলের বাড়াবাড়ি তারাবিহ: ২ | নারীর মর্যাদা ও অধিকার এবং অলৌকিক তিন ঘটনা তারাবিহ: ৩ | যে ১৪ নারীকে বিয়ে করা হারাম তারাবিতে: ১২ | মহানবী (সা.)–এর আকাশভ্রমণ এবং আসহাবে কাহাফের কাহিনি

রেডমি নোট ৯ এর বিস্তারিত | Redmi Note 9 in Bangla

৩০ এপ্রিল, ২০২০ এ শাওমির ঘোষনা আসে এই ফোনটি নিয়ে। কিন্তু ফোনটি মার্কেটে আসে মে মাসের শেষের দিকে৷ করোনার কারনে ফোনটি বাংলাদেশে আসতে আরো সময় নেয়। বর্তমানে বাংলাদেশে আন অফিশিয়াল ভাবে ফোনটি পাওয়া যাচ্ছে৷ বাংলাদেশে অফিশিয়াল ভাবে এখনো ফোনটি আসার তথ্য নেয়৷ চলুন ফোনটি নিয়ে বিস্তারিত আলোচনা করা যাক। শাওমি নোট সিরিজের ফোন বের করে এদের রেডমি নামে সাব ব্যান্ড৷ এদের কাজ হল এই নোট সিরিজ নিয়ে কাজ করা৷ প্রতিবছর নোট সিরিজের ১/২ টা ফোন বাজারে আসে। সাথে সেই ফোন গুলার বিভিন্ন ভার্সন (যেমন - র‍্যাম ও রমের ভিত্তিতে) বাজারে আসে। এই বছরও তারা রেডমি সিরিজের নোট ৯ বাজারে আনে। এই বছর হয়তো এই সিরিজের আরো ফোন বাজারে আসবে। ডিস্পলেঃ ফোনটির ডিসপ্লে সাইজ ৬.৫৩ ইঞ্চি। এতে আইপিএস এলসিডি ডিসপ্লে ব্যবহার করা হয়েছে। এই ফোনের ডিসপ্লে প্রটেকশন হিসেবে আছে গরিলা গ্লাস ফাইভ। স্ক্রিন আর ফোনের বডির অনুপাত প্রায় ৮৩.৫%। এই ফোনের ডিসপ্লে ফুলএইচডি মানে ১০৮০পি। এই ডিস্পলের দৈর্ঘ্য ১৯.৫ একক এবং প্রস্থ হল ৯ একক। এত বড় ফোনের কারনে এই ফোনের পিপি আই ডেনসিটি ৩৯৫। যা একটু কম। প্লাটফর্মঃ এই ফোনের অপারেটিং সিস্টেম এন্ড্রয়েড ১০ এবং এর...