057 · Online Stock Span

algorithm
Published

July 13, 2026

Problem

设计一个类 StockSpanner,它用来处理每天到来的股票价格。

这个类需要支持一个方法:

next(price)

每次调用 next(price) 时,表示今天的股票价格是 price

你需要返回今天的股票跨度。

股票跨度的意思是:

从今天开始,向前连续看多少天,这些天的价格都小于或等于今天的价格。

也就是说,今天本身一定会被算进去,所以跨度至少是 1

例如,连续收到这些价格:

[100, 80, 60, 70, 60, 75, 85]

每一天的跨度是:

  • 100 前面没有其他天,所以跨度是 1
  • 80 前一天 100 比它大,所以只能算今天,跨度是 1
  • 60 前一天 80 比它大,所以跨度是 1
  • 70 可以包含今天 70 和前一天 60,但再前面的 80 比它大,所以跨度是 2
  • 60 前一天 70 比它大,所以跨度是 1
  • 75 可以包含 75, 60, 70, 60,但再前面的 80 比它大,所以跨度是 4
  • 85 可以包含 85, 75, 60, 70, 60, 80,但再前面的 100 比它大,所以跨度是 6

所以每次调用返回的结果依次是:

[1, 1, 1, 2, 1, 4, 6]

请实现 StockSpanner 类:

  • StockSpanner() 初始化对象
  • next(price) 接收今天的价格,并返回今天的股票跨度

Examples

示例 1

Input:
["StockSpanner", "next", "next", "next", "next", "next", "next", "next"]
[[], [100], [80], [60], [70], [60], [75], [85]]

Output:
[null, 1, 1, 1, 2, 1, 4, 6]

解释:

StockSpanner stockSpanner = new StockSpanner()
stockSpanner.next(100)  # 返回 1
stockSpanner.next(80)   # 返回 1
stockSpanner.next(60)   # 返回 1
stockSpanner.next(70)   # 返回 2
stockSpanner.next(60)   # 返回 1
stockSpanner.next(75)   # 返回 4
stockSpanner.next(85)   # 返回 6

示例 2

Input:
["StockSpanner", "next", "next", "next"]
[[], [31], [41], [48]]

Output:
[null, 1, 2, 3]

解释:价格每天都更高,所以每一天都可以把前面连续的所有天数算进跨度里。

示例 3

Input:
["StockSpanner", "next", "next", "next"]
[[], [90], [80], [70]]

Output:
[null, 1, 1, 1]

解释:价格每天都更低,所以每一天都只能算今天自己。

Constraints

  • \(1 \leq\) price \(\leq 10^5\)
  • 最多会调用 next \(10^4\)