--- title: '901. Online Stock Span' description: Design an algorithm that collects daily price quotes for some stock and returns the span of that stock's price for the current day icon: dot topics: - { name: "Stack", slug: "stack" } - { name: "Design", slug: "design" } - { name: "Monotonic Stack", slug: "monotonic-stack" } - { name: "Data Stream", slug: "data-stream" } issue: "https://github.com/prdlk/leetcode/issues/75" sidebar: label: 'Online Stock Span' badge: 'Medium' --- ### Example 1: - Input: `` - Output: `` - Explanation: 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] Explanation StockSpanner stockSpanner = new StockSpanner(); stockSpanner.next(100); // return `1` stockSpanner.next(80); // return `1` stockSpanner.next(60); // return `1` stockSpanner.next(70); // return `2` stockSpanner.next(60); // return `1` stockSpanner.next(75); // return `4`, because the last `4` prices (including today's `price` of `75`) were less than or equal to today's `price`. stockSpanner.next(85); // return `6` ### Constraints: - `1 <= price <= 10^5` - At most 10^4 calls will be made to next. ## Solution ```py class StockSpanner: def __init__(self): self.stack = [] def next(self, price: int) -> int: ans = 1 while self.stack and self.stack[-1][0] <= price: ans += self.stack.pop()[1] self.stack.append([price, ans]) return ans # Your StockSpanner object will be instantiated and called as such: # obj = StockSpanner() # param_1 = obj.next(price) ```