股票价格跨度【LC901】
编写一个 StockSpanner 类,它收集某些股票的每日报价,并返回该股票当日价格的跨度。
今天股票价格的跨度被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今天)。
例如,如果未来7天股票的价格是 [100, 80, 60, 70, 60, 75, 85],那么股票跨度将是 [1, 1, 1, 2, 1, 4, 6]。
感冒快快好,脑子快转不起来了
暴力
class StockSpanner { List<Integer> list ; public StockSpanner() { list = new ArrayList<>(); } public int next(int price) { int size = list.size(); int res = 1; for (int i = size - 1; i >= 0; i--){ if (list.get(i) <= price){ res++; }else{ break; } } list.add(price); return res; } }
单调栈
调用next时,需要返回从今天开始往回数,股票价格小于或等于今天价格的最大连续日数。如果把每日的 price当成数组不同下标的值,即需要求出每个值与上一个更大元素之间的下标之差—>单调栈
- 单调栈里存放的元素:股票价格的下标(即天数)和股票价格的二元组,首先在栈中先插入一个最大值作为天数为-1天的价格。
- 单调栈里元素从栈头到栈底的顺序为递增
- 单调栈的判断条件
。当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况
将当前元素入栈,并计算下标差返回
。当前遍历的元素T[i]大于等于栈顶元素T[st.top()]的情况
将栈顶元素弹出
class StockSpanner { Deque<int[]> st; int idx; public StockSpanner() { st = new LinkedList<>(); st.addFirst(new int[]{-1,Integer.MAX_VALUE}); idx = -1; } public int next(int price) { idx++; while (price >= st.peekFirst()[1]){ st.pollFirst(); } int res = idx - st.peekFirst()[0]; st.addFirst(new int[]{idx,price}); return res; } } /** * Your StockSpanner object will be instantiated and called as such: * StockSpanner obj = new StockSpanner(); * int param_1 = obj.next(price); */