分析
- 维护单调递减栈:
- 栈中存储之前的股票价格以及对应的日期索引
- 保证栈中从栈底到栈顶的股票价格递减。这样可以快速找到比当前价格大的最近日期
- 核心操作:
- 对于当前股价
price
:
- 不断弹出栈顶元素,直到栈顶价格大于当前价格
- 此时栈顶对应的索引即为最近一个比当前价格高的日期
- 当前跨度为:当前日期索引减去栈顶索引
- 边界处理:
- 初始化时,将一个虚拟价格(如
10^6
)和一个虚拟日期(如 -1
)入栈,方便处理第一天的数据
时间复杂度
每个价格最多会被栈操作一次(入栈和出栈各一次),因此所有操作的总时间复杂度为 O(n)
,每次调用 next
的均摊时间复杂度为 O(1)
空间复杂度
空间复杂度为 O(n)
C++代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
class StockSpanner
{
public:
std::stack<int> prices; // 单调栈存储股票价格
std::stack<int> day; // 单调栈存储对应的日期索引
int cur = 0; // 当前的日期索引
StockSpanner()
{
// 初始化栈:存入虚拟的最大价格和虚拟日期
prices.push(1e6);
day.push(-1);
}
int next(int price)
{
// 弹出所有小于等于当前价格的栈顶元素
while (prices.top() <= price)
{
prices.pop();
day.pop();
}
// 计算跨度:当前日期索引减去栈顶索引
int res = cur - day.top();
// 将当前价格和索引入栈
prices.push(price);
day.push(cur++);
return res;
}
};
|