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

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

সবাইকে স্বাগতম! আজকের এই আলোচনায় আমরা একটি দারুণ মজার এবং গুরুত্বপূর্ণ সমস্যা সমাধান করব। যার নাম হলো '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) ইল্লিয়িন হলো সৎকর্মশীলদের (মুমিন ও নেককারদের) আমলনামা সংরক্ষণের স্থান । এটি সপ্তম আসমানের ওপরে সংরক্ষিত এক সম্মানিত স্থান। সূরা আল-মুতাফফিফীন (৮৩:১৮-২১) তে বলা হয়েছে: "كَلَّا إِنَّ كِتَابَ الْأَبْرَارِ لَفِي عِلِّيِّينَ ۝ وَمَا أَدْرَاكَ مَا عِلِّيُّونَ ۝ كِتَابٌ مَرْقُومٌ ۝ يَش...

জাভা ফিডব্যাক এবং স্ট্রাকচার্ড কনকারেন্সি: বিবর্তনের গল্প

Introduction এই ভিডিওর নির্দিষ্ট অংশে জাভা ল্যাঙ্গুয়েজ আর্কিটেক্ট ব্রায়ান গোয়েটজ (Brian Goetz) আলোচনা করেছেন কীভাবে জাভার নতুন ফিচারগুলো তৈরি হয় এবং এতে সাধারণ ডেভেলপারদের মতামতের গুরুত্ব কতটুকু। বিশেষ করে Structured Concurrency -এর মতো জটিল ফিচারগুলো কেন বারবার 'Preview' অবস্থায় থাকে এবং কীভাবে কমিউনিটির ফিডব্যাক সেই ফিচারগুলোকে আরও নিখুঁত করতে সাহায্য করে, তা এখানে সহজভাবে বোঝানো হয়েছে। ১. ভালো ফিডব্যাক আসলে কী? ভিডিও রেফারেন্স: [ 34:53 ] ব্রায়ান গোয়েটজ বলছেন যে, জাভা টিম যখন কোনো নতুন ফিচারের খসড়া (Draft) বা প্রস্তাব (JEP) প্রকাশ করে, তখন তারা এমন কিছু জানতে চায় যা তারা নিজেরা আগে ভাবেনি। বিস্তারিত: একজন ডেভেলপার হিসেবে আমরা যখন কোনো নতুন ফিচার দেখি, আমাদের প্রথম প্রতিক্রিয়া হয় সেটার Syntax বা লেখার ধরন নিয়ে। কিন্তু ব্রায়ানের মতে, "এই লেখাটা কেন এমন হলো?" বা "এটা কোটলিন বা স্কালা-র মতো কেন নয়?"—এই ধরনের ফিডব্যাক খুব একটা কাজে আসে না। আসল দামী ফিডব্যাক হলো সেইটা, যা নতুন কোনো বাস্তব সমস্যা (Edge Case) তুলে ধরে। আমার চিন্তা: আপনি যদি কেবল দ...

[Master Post] Machine Learning for Everybody – Full Course

URL: https://youtu.be/i_LwzRVP7bg?t=0 Title: Machine Learning for Everybody – Full Course Topics:- মেশিন লার্নিংয়ের হাতেখড়ি এবং গুগল কোল্যাব সেটআপ মেশিন লার্নিংয়ের খুঁটিনাটি ও ফিচারের সহজ পাঠ Classification বনাম Regression এবং মডেল ট্রেনিংয়ের সহজ পাঠ মেশিন লার্নিংয়ের জন্য ডেটা তৈরি এবং প্রসেসিং করার সহজ গাইড K-Nearest Neighbors (KNN) থিওরির সহজ পাঠ কে-নিয়ারেস্ট নেইবারস (KNN) ইমপ্লিমেন্টেশন সহজ বাংলায় নেইভ বেইজ থিওরি এবং এর প্রয়োগ: সহজ পাঠ লজিস্টিক রিগ্রেশন: থিওরি ও ইমপ্লিমেন্টেশন SVM থিওরি এবং ইমপ্লিমেন্টেশন সহজ পাঠ নিউরাল নেটওয়ার্ক এবং টেনসরফ্লোর সহজ পাঠ টেনসরফ্লো দিয়ে নিউরাল নেটওয়ার্ক ক্লাসিফিকেশন শেখার সহজ গাইড লিনিয়ার রিগ্রেশন: সহজ কথায় মূল ধারণা ও গণিত লিনিয়ার রিগ্রেশন: সহজ ভাষায় খুঁটিনাটি ও হাতে-কলমে শেখা লিনিয়ার রিগ্রেশন এবং নিউরন মডেলের সহজ পাঠ TensorFlow দিয়ে রিগ্রেশন নিউরাল নেটওয়ার্ক তৈরি - পার্ট ১ টেনসরফ্লো দিয়ে রিগ্রেশন নিউরাল নেটওয়ার্ক তৈরি - পার্ট ২ আনসুপারভাইজড লার্নিং: কে-মিনস ক্লাস্টারিংয়ের সহজ পাঠ Principal C...