কম্পিউটার টিউটোরিয়াল

C++-এ দिये गये অ্যারেতে প্রতিটি উইন্ডো আকারের জন্য ন্যূনতমের সর্বোচ্চ মান খুঁজুন

এই সমস্যায়, আমাদের একটি অ্যারে arr[] দেওয়া আছে যার আকার n। আমাদের কাজ হলো দেওয়া অ্যারেতে প্রতিটি উইন্ডো আকারের জন্য ন্যূনতমের সর্বোচ্চ মান খুঁজে বের করা।

সমস্যা বিবরণ

আমাদের ১ থেকে n পর্যন্ত变化する উইন্ডো আকারের জন্য ন্যূনতমের সর্বোচ্চ মান বের করতে হবে। এই জন্য দেওয়া উইন্ডো আকারের সাবঅ্যারে গুলো বিবেচনা করে, প্রতিটি সাবঅ্যারের ন্যূনতম উপাদান বের করব এবং তারপর সব ন্যূনতমের মধ্যে সর্বোচ্চ মান বের করব।

উদাহরণ

ইনপুট

arr[] = {4, 1, 2, 4, 5, 1, 2, 4}

আউটপুট

5 4 2 1 1 1 1 1

ব্যাখ্যা

উইন্ডো আকার ১: উইন্ডো { (4), (1), (2), (4), (5), (1), (2), (4) } => ন্যূনতম = {4, 1, 2, 4, 5, 1, 2, 4} => ন্যূনতমের সর্বোচ্চ = ৫
উইন্ডো আকার ২: উইন্ডো { (4, 1), (1, 2), (2, 4), (4, 5), (5, 1), (1, 2), (2, 4) } => ন্যূনতম = {1, 1, 2, 4, 1, 1, 2} => ন্যূনতমের সর্বোচ্চ = ৪
উইন্ডো আকার ৩: উইন্ডো { (4, 1, 2), (1, 2, 4), (2, 4, 5), (4, 5, 1), (5, 1, 2), (1, 2, 4) } => ন্যূনতম = {1, 1, 2, 1, 1, 1} => ন্যূনতমের সর্বোচ্চ = ২
উইন্ডো আকার ৪-৮: সবগুলোতে ন্যূনতমের সর্বোচ্চ = ১

সমাধানের পদ্ধতি

একটি সহজ সমাধান হলো ১ থেকে n আকারের সব উইন্ডো তৈরি করা। প্রতিটি উইন্ডো আকারের জন্য সেই আকারের সব সাবঅ্যারে বের করে ন্যূনতম খুঁজে বের করা এবং সর্বোচ্চ মান প্রিন্ট করা।

C++ প্রোগ্রাম উদাহরণ (সহজ পদ্ধতি)

#include <iostream>
using namespace std;

void printMaxMinWindowK(int arr[], int n, int k) {
    int maxMin = -1;
    int minEle = -1;
    for (int i = 0; i <= n-k; i++) {
        minEle = arr[i];
        for (int j = 1; j < k; j++) {
            if (arr[i+j] < minEle)
                minEle = arr[i+j];
        }
        if (minEle > maxMin)
            maxMin = minEle;
    }
    cout << maxMin << endl;
}

int main() {
    int arr[] = {4, 1, 2, 4, 5, 1, 2, 4};
    int n = sizeof(arr)/sizeof(arr[0]);
    for(int i = 1; i <= n; i++){
        cout << "Window Size: " << i << ", maximum of minimum: ";
        printMaxMinWindowK(arr, n, i);
    }
    return 0;
}

আউটপুট

Window Size :1, maximum of minimum : 5
Window Size :2, maximum of minimum : 4
Window Size :3, maximum of minimum : 2
Window Size :4, maximum of minimum : 1
Window Size :5, maximum of minimum : 1
Window Size :6, maximum of minimum : 1
Window Size :7, maximum of minimum : 1
Window Size :8, maximum of minimum : 1

বিকল্প সমাধান (স্ট্যাক ব্যবহার করে O(n) টাইমে)

একটি সহজ সমাধান হলো অতিরিক্ত মেমোরি ব্যবহার করে অক্সিলিয়ারি অ্যারে তৈরি করা। আমরা নেক্সট স্মোলেস্ট এবং প্রিভিয়াস স্মোলেস্ট এলিমেন্ট সংরক্ষণ করার জন্য দুটি অ্যারে ব্যবহার করব। এই অ্যারেগুলো ব্যবহার করে উইন্ডো দৈর্ঘ্য বের করা যায়: "right[i] - left[i] - 1"। এরপর দেওয়া উইন্ডোর জন্য ন্যূনতমের সর্বোচ্চ মান বের করা যায়।

C++ প্রোগ্রাম উদাহরণ (স্ট্যাক ব্যবহার করে)

#include <iostream>
#include<stack>
using namespace std;

void printMaxMinWindow(int arr[], int n) {
    stack<int> s;
    int prev[n+1];
    int next[n+1];
    for (int i=0; i= arr[i])
            s.pop();
        if (!s.empty())
            prev[i] = s.top();
        s.push(i);
    }
    while (!s.empty())
        s.pop();
    for (int i = n-1; i>=0; i--) {
        while (!s.empty() && arr[s.top()] >= arr[i])
            s.pop();
        if(!s.empty())
            next[i] = s.top();
        s.push(i);
    }
    int maxOfMin[n+1];
    for (int i=0; i<=n; i++)
        maxOfMin[i] = 0;
    for (int i=0; i=1; i--)
        maxOfMin[i] = max(maxOfMin[i], maxOfMin[i+1]);
    for (int i=1; i<=n; i++)
        cout << "Window Size: " << i << ", maximum of minimum: " << maxOfMin[i] << endl;
}

int main() {
    int arr[] = {4, 1, 2, 4, 5, 1, 2, 4};
    int n = sizeof(arr)/sizeof(arr[0]);
    printMaxMinWindow(arr, n);
    return 0;
}

আউটপুট

Window Size: 1, maximum of minimum: 5
Window Size: 2, maximum of minimum: 4
Window Size: 3, maximum of minimum: 2
Window Size: 4, maximum of minimum: 1
Window Size: 5, maximum of minimum: 1
Window Size: 6, maximum of minimum: 1
Window Size: 7, maximum of minimum: 1
Window Size: 8, maximum of minimum: 1
  1. C++-এ বাইনারি ট্রিতে সর্বোচ্চ ও ন্যূনতম মান বের করুন

  2. C++-এ দেয়া অ্যারে এবং k-র জন্য |ai + aj – k|-র মিনিমাম পসিবল ভ্যালু

  3. সি++ প্রোগ্রাম: অ্যারেতে প্রতিটি উপাদানের জন্য সবচেয়ে নিকটবর্তী বড় মান (Closest Greater Value) খুঁজে বের করা

  4. সি++ প্রোগ্রাম: অ্যারেতে প্রতিটি উপাদানের জন্য সবচেয়ে নিকটবর্তী বড় মান (Closest Greater Value) খুঁজে বের করা