Java-数据结构-单调栈<一>

本文介绍了单调栈的概念,包括单调递增和递减栈,并通过讲解LeetCode的739每日温度、496下一个更大元素I和503下一个更大元素II三道题目,阐述了单调栈的应用。在实战中,强调了如何利用单调栈解决找最近一个比当前值大/小的问题,以及如何处理数组循环的情况。
摘要由CSDN通过智能技术生成

1.单调栈的简单介绍

        一般使用单调栈无非两个方向,单调递减,单调递增。

单调递增栈:存进去的数据都是增加的,碰到减少的时候,这时就要进行操作了

单调递减栈:存进去的数据都是减少的,碰到增加的时候,这时就要进行操作了

        以数组nums[] = {3,2,1,4,6,5,7}举例,那么我们的单调递增栈为:

 那么,对应的单调递减栈是一样的道理。

2.单调栈的用法

        对于「找最近一个比当前值大/小」的问题,都可以用单调栈来试试。关键在于,对于栈内存储的元素,什么时候进行取出来操作,是个关键的问题。

3.leetcode实战

1. leetcode739 每日温度

        给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指在第 i 天之后,才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。

输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]

 class Solution {
    public int[] dailyTemperatures(int[] T) {
        Deque<Integer> stack = new ArrayDeque<>();
        int[] arr = new int[T.length];
        for(int i = 0; i < T.length; i++){
            while(!stack.isEmpty() && T[stack.peek()] < T[i]){
                arr[stack.peek()] = i - stack.pop();
            }
            stack.push(i);
        }
        return arr;
    }
}

对于本题的单调栈过程:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值