ধরুন আমাদের একটি API আছে, যেটি কিছু স্টকের জন্য দৈনিক মূল্যের উদ্ধৃতি সংগ্রহ করে এবং বর্তমান দিনের জন্য সেই স্টকের মূল্যের স্প্যানটি ফেরত দেয়। এখানে আজকের স্টকের দামের স্প্যানকে −
হিসাবে সংজ্ঞায়িত করা হয়েছে- সর্বোচ্চ সংখ্যক পরপর দিন (আজ থেকে শুরু করে পিছনের দিকে যাওয়া) যেখানে স্টকের দাম আজকের দামের চেয়ে কম বা সমান ছিল।
উদাহরণস্বরূপ, যদি আমরা 7 দিনের স্টক শেয়ারের রেকর্ড দেখি [100, 80, 60, 70, 60, 75, 85], তাহলে স্টক স্প্যান হবে [1, 1, 1, 2, 1, 4, 6]। আমাদের সেই API-এর জন্য প্রকৃত মডিউল লিখতে হবে, যেটি ব্যবহার করা হবে যখন এই মডিউলটিকে বলা হবে
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- দুটি অ্যারে st, v এবং counter সংজ্ঞায়িত করুন, কাউন্টারকে 0 হিসাবে সেট করুন
- কাউন্টার 1 দ্বারা বাড়ান
- যদিও st খালি নয় এবং মূল্য>=v[স্ট্যাক টপ এলিমেন্ট]
- স্ট্যাক থেকে পপ।
- উত্তর :=স্ট্যাক খালি হলে কাউন্টার, অন্যথায় উত্তর :=কাউন্টার - স্ট্যাক টপ
- v-এ মূল্য সন্নিবেশ করান
- st-এ কাউন্টার ঢোকান
- উত্তর ফেরত দিন
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#include <bits/stdc++.h> using namespace std; class StockSpanner { public: vector <int> st; int counter; vector <int> v; StockSpanner() { counter = 0; } int next(int price) { counter++; while(!st.empty() && price >= v[st.back() - 1])st.pop_back(); int ans = st.empty() ? counter : counter - st.back(); v.push_back(price); st.push_back(counter); return ans ; } }; main(){ StockSpanner ob; cout <<(ob.next(100)) << endl; cout <<(ob.next(80)) << endl; cout <<(ob.next(60)) << endl; cout <<(ob.next(70)) << endl; cout <<(ob.next(60)) << endl; cout <<(ob.next(75)) << endl; cout <<(ob.next(85)) << endl; }
ইনপুট
Initialize the class, then call next() method using different values. See the main() methodদেখুন
আউটপুট
1 1 1 2 1 4 6