栈的应用——股票价格跨度
题意:
-
编写一个 StockSpanner 类,它收集某些股票的每日报价,并返回该股票当日价格的跨度。 今天股票价格的跨度被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今天)。 例如,如果未来7天股票的价格是 [100, 80, 60, 70, 60, 75, 85],那么股票跨度将是 [1, 1, 1, 2, 1, 4, 6]。
思路: 使用一个栈来记录股票价小于等于今天股票价格的天数(包括今天)days; 要先清楚:当新的一天today的price小于等于前一天yesterday时,意味着today的days就是yesterday的days+today.days(todays.days=1,因为满足等于), 再与yesterday的前一天的price比较; 如果还是小于就加上它的days。
Stack price; Stack days; while(today.price>yesterday.price&&!price.empty ()){ today.days=today.days+yesterday.days; price.pop( ); days.pop() ; } //再将新的一天的price和days入栈 price.push(today.price); days.push(today.days);
如果today.price小于之前的一天,则根本不用与再前些天作比较。到此就已经结束。today.days=1; 否则,today.price>=yesterday.price,那今天价格也肯定大于yesterday.days中那些小于yesterday.price 的日子。这样yesterday.price就不需要存在了,today.price继续与之前的日子价格比较,还是分两种情况; 最后将today.price和today.days分别进栈,之前因为更新today的数据而删除的数据不会影响将来一天的价格跨度,因为today.days已经是小于等于today.price的所有连续天数;
days中记录的就是具体一天的股票价格跨度。(相当于连续区间的长度),这个区间记录的天数是满足小于这一天价格的天数。
class StockSpanner { Stack<Integer> prices; Stack<Integer> days; public StockSpanner() { prices=new Stack(); days=new Stack(); } public int next(int price) { int days=1; while(!days.empty()&&prices.peek()<=price){ days+=days.pop(); prices.pop(); } days.push(count); prices.push(price); return days; } }