持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第24天,点击查看活动详情
快乐周五,无惊无险,马上又是周末了
股票价格跨度
该题出自力扣的901题 —— 股票价格跨度【中等题】
审题
编写一个 StockSpanner 类,它收集某些股票的每日报价,并返回该股票当日价格的跨度。 今天股票价格的跨度被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今天)。 例如,如果未来7天股票的价格是 [100, 80, 60, 70, 60, 75, 85],那么股票跨度将是 [1, 1, 1, 2, 1, 4, 6]。
- 这道题题意并不困难,是一道情景实现题,所谓的找出股票的每日最低报价
- 其实就是给出一个数值,找出之前存储的数值的最近最大值,并返回最长个数,一开始会错意了,以为需要遍历找到所有的连续子序列,再返回最大,其实只需要最近的即可,因为是包含自身,所以默认最低为1
- 解法多种多样,一开始选择使用List的解法,就直接遍历列表,存储所有的价格值,每次都从末尾开始遍历,直到找到最近的最大值,则返回个数下标,但是效率偏低,如果是线性递增的数组,可能需要每次都遍历长度的复杂度
- 栈内以数组 (idx,price) 形式维护比当前元素 price 大的元素,遇到比当前小的直接出栈,并且用变量存储下标
- 最终返回下标即可
编码
public StockSpanner() {
}
List<Integer> list = new ArrayList<>();
public int next(int price) {
list.add(price);
int size = list.size();
int num = 0;
for (int i = size - 1; i >=0 ; i--) {
if (list.get(i) <= price){
num++;
}else {
break;
}
}
return num;
}
class StockSpanner {
Deque<int[]> stack;
int idx;
public StockSpanner() {
stack = new ArrayDeque<int[]>();
stack.push(new int[]{-1, Integer.MAX_VALUE});
idx = -1;
}
public int next(int price) {
idx++;
while (price >= stack.peek()[1]) {
stack.pop();
}
int ret = idx - stack.peek()[0];
stack.push(new int[]{idx, price});
return ret;
}
}