假设我们有一个API,该API收集某些股票的每日价格报价,并返回该股票当天的价格范围。在这里,今天的股票价格范围定义为-
股票价格小于或等于今天的价格的最大连续天数(从今天开始并向后倒退)。
例如,如果我们看到7天的股票记录,例如[100、80、60、70、60、75、85],则股票跨度将为[1、1、1、2、1、4、6]。我们必须为该API编写实际的模块,该模块将在调用该模块时使用
为了解决这个问题,我们将遵循以下步骤-
定义两个数组st,v和counter,将counter设置为0
计数器增加1
当st不为空且价格> = v [堆栈顶部元素]
从堆栈弹出。
ans:=堆栈为空时的计数器,否则ans:=计数器–堆栈顶部
在v中插入价格
将计数器插入st
返回ans
让我们看下面的实现以更好地理解-
#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