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

C++-এ Next Greater Element II

এই সমস্যায় একটি সার্কুলার অ্যারে দেওয়া থাকলে, প্রতিটি এলিমেন্টের জন্য নেক্সট গ্রেটার এলিমেন্ট বের করতে হবে। সার্কুলার মানে শেষ এলিমেন্টের পর প্রথম এলিমেন্ট। না পেলে -1।

উদাহরণ: [1,2,1,3,2,1] -> আউটপুট [2,3,3,-1,3,2]।

সমাধানের পদ্ধতি (Monotonic Stack + Circular Traversal)

  • রেজাল্ট অ্যারে -1 দিয়ে ইনিশিয়ালাইজ করুন।
  • স্ট্যাকে ইন্ডেক্স রাখুন (মনোটোনিক ডিক্রিজিং)।
  • অ্যারে দুইবার ট্রাভার্স করুন (i = 0 to 2n-1), ইন্ডেক্স = i % n।
  • যখন nums[stack.top()] < nums[idx], তখন res[stack.top()] = nums[idx] এবং পপ করুন।
  • কারেন্ট ইন্ডেক্স পুশ করুন।

উদাহরণ (C++)

#include <bits/stdc++.h>
using namespace std;

void printVec(vector<int> v) {
    cout << "[";
    for (int i = 0; i < v.size(); i++) cout << v[i] << (i+1==v.size()?"":", ");
    cout << "]" << endl;
}

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        int n = nums.size();
        vector<int> res(n, -1);
        stack<int> st;
        for (int i = 0; i < 2 * n; i++) {
            int idx = i % n;
            while (!st.empty() && nums[st.top()] < nums[idx]) {
                res[st.top()] = nums[idx];
                st.pop();
            }
            st.push(idx);
        }
        return res;
    }
};

int main() {
    Solution ob;
    vector<int> v = {1, 2, 1, 3, 2, 1};
    printVec(ob.nextGreaterElements(v));
    return 0;
}

ইনপুট

[1,2,1,3,2,1]

আউটপুট

[2, 3, 3, -1, 3, 2]
  1. C++-এ পরবর্তী বড়তর উপাদান III

  2. C++-এ অ্যারেতে পূর্ববর্তী সর্বোচ্চ উপাদান (Previous Greater Element)

  3. C++-এ মিন হিপে সর্বোচ্চ উপাদান

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