Leetcode P456 Java使用单调栈来解决

Leetcode P456 Java使用单调栈来解决

执行用时:21 ms, 在所有 Java 提交中击败了40.96%的用户

内存消耗:59.7 MB, 在所有 Java 提交中击败了82.52%的用户

ideas

​ 创建一个数组,用来记录从i到num.length()中最小的数,接下来在创建一个栈从后往前遍历数组,这个栈找到大于min[i]且小于nums[i]的元素。

​ 首先判断下数组长度是否小于3,如果小于是false

        if (nums.length < 3){
            return false;
        }

​ 创建一个数组用来记录i到num.length中最小的数,这么做的原因就是保证我们132中的其中1要保证是最小的值

//用来维护第一个数字是最小的
int[] minarr = new int[nums.length];
minarr[0] = nums[0];

for (int i = 1; i < nums.length; i++) {
    minarr[i] = Math.min(minarr[i-1],nums[i]);
}

接下来创建一个栈用,然后从后往前遍历去找到大于min[i]且小于nums[i]的元素。

       Stack<Integer> stack = new Stack<>();
        for (int i = nums.length-1; i >= 0 ; i--) {
     			......
        }

在循环期间一定要先筛选出num[i] > min[i]的元素,因为只有满足这个条件才能是我们想要的元素

        for (int i = nums.length-1; i >= 0 ; i--) {
            if (nums[i] > minarr[i]){
							 ...
            }
        }

如果满足了这个条件,如果我们的栈不为NULL,但是我们栈中的元素小于等于minarr[i]的元素,然后直接把把栈中的元素抛出,这么做就是为了保证找出132 其中的2

                //把栈里小于当前下标的最小值的全部移除
                while (!stack.isEmpty() && stack.peek() <= minarr[i]){
                    stack.pop();
                }

接下来判断我们栈中的peek()是否小于nums[i],如果小于那么我们就找到了大于min[i]且小于nums[i]的元素

if (!stack.isEmpty() && stack.peek() <nums[i]){
    return true;
}

如果if不合法,那么就证明,当前这个元素可能是我们想要的132中的3,所以我们把当前这个元素添加到stack中,在后续的判断是否满足132.

stack.push(nums[i]);

如果以上循环没有找到我们要的元素,那么直接返回false

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哇塞大嘴好帅(DaZuiZui)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值