สมมติว่าเรามี API ที่รวบรวมราคารายวันสำหรับหุ้นบางตัว และส่งคืนช่วงราคาหุ้นนั้นสำหรับวันปัจจุบัน ขอบเขตของราคาหุ้นวันนี้ถูกกำหนดเป็น −
- จำนวนวันต่อเนื่องสูงสุด (เริ่มตั้งแต่วันนี้และย้อนกลับ) โดยที่ราคาหุ้นน้อยกว่าหรือเท่ากับราคาวันนี้
ตัวอย่างเช่น หากเราเห็นบันทึกการแชร์หุ้น 7 วัน เช่น [100, 80, 60, 70, 60, 75, 85] จากนั้นช่วงสต็อกจะเป็น [1, 1, 1, 2, 1, 4, 6] เราต้องเขียนโมดูลจริงสำหรับ API นั้น ซึ่งจะใช้เมื่อโมดูลนี้ถูกเรียก
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดสองอาร์เรย์ st, v และตัวนับ ตั้งค่าตัวนับเป็น 0
- เพิ่มตัวนับ 1
- ในขณะที่ st ไม่ว่างเปล่าและราคา>=v[stack top element]
- ป๊อปจากสแต็ก
- ans :=ตัวนับเมื่อ stack ว่างเปล่า มิฉะนั้น ans :=counter – stack top
- ใส่ราคาใน 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