单调栈
单调栈,顾名思义,就像程序员的生活:敲代码,看着别人敲代码,学着敲出更牛逼的代码--单调,单调栈又分为单调递增栈和单调递减栈。
单调递增栈: 从栈底到栈顶元素依次递减,如果新的入栈元素比栈顶元素大,则栈顶元素出栈,如果新的入栈元素还是比栈顶元素大,栈顶元素继续出栈,直到新的入栈元素比栈顶元素小或者栈内元素为空,则新的元素入栈。 单调递减栈: 从栈底到栈顶元素依次递增,如果新的入栈元素比栈顶元素小,则栈顶元素出栈,如果新的入栈元素还是比栈顶元素小,栈顶元素继续出栈,直到新的入栈元素比栈顶元素大或者栈内元素为空,则新的元素入栈。
示例 以单调递减栈为例,现在我们将 [2, 3, 1, 2, 4, 2] 这组元素入栈,整个过程如下所示
| 第n步 | 操作 | 栈内元素 |
|---|---|---|
| 1 | 栈为空,2入栈 | 2 |
| 2 | 栈顶为2,3比2大,3入栈 | 2,3 |
| 3 | 栈顶为3,1比3小,3出栈 | 2 |
| 4 | 栈顶为2,1比2小,2出栈 | 空 |
| 5 | 栈为空,1入栈 | 1 |
| 6 | 栈顶为1,2比1大,2入栈 | 1,2 |
| 7 | 栈顶为2,4比2大,4入栈 | 1,2,4 |
| 8 | 栈顶为4,2比4小,4出栈 | 1,2 |
| 9 | 栈顶为2,2等于2,(等于的情况可以按照实际情况来处理,决定是否入栈,这里作入栈处理) 2入栈 | 1,2,2 |
| 10 | 结束 | 1,2,2 |
最后举一个lintcode上的单调栈相关的算法题,以及结果代码。
描述 一位店主需要完成一项销售任务,他将要出售的物品排成一排。 从左侧开始,店主以其全价减去位于该物品右侧的第一个价格较低或价格相同的商品的价格。 如果右侧没有价格低于或等于当前商品价格的商品,则以全价出售当前商品。 你需要返回每一个物品实际售出价格。
数组 Prices 的长度范围是: [1, 100000] Prices[i] 的整数范围是: [1, 1000000]
样例 示例 1:
输入: Prices = [2, 3, 1, 2, 4, 2] 输出: [1, 2, 1, 0, 2, 2] 解释: 第0个和第1个物品右边第一个更低的价格都是1,所以实际售价需要在全价上减去1, 第3个物品右边第一个更低的价格是2,所以实际售价要在全价上面减去2。 示例 2:
输入: Prices = [1, 2, 3, 4, 5] 输出: [1, 2, 3, 4, 5] 解释: 每一个物品都保持原价,他们的右边都没有等于或者更低价格的物品
代码:
public class Solution {
public int[] FinalDiscountedPrice(int[] prices) {
Stack<Integer> s = new Stack<>();
for(int i=0;i<prices.length;i++){
while(!s.empty()&&prices[s.peek()]>=prices[i]){
int index = s.pop();
prices[index]-=prices[i];
}
s.push(i);
}
return prices;
}
}
新人上路,有写错的地方欢迎大家指正,多交流,多学习~