ধরুন আমাদের একটি 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