C ++中的在线股票跨度

假设我们有一个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