单调栈~~下一个更大的元素

在这里插入图片描述

单调栈无非两种思路:
第一种是只有比栈顶小的才能进栈,保证栈顶最小;

另一种是比栈顶大的才能进栈,否则弹出栈顶,本题需求是得到左边和右边比其小的,那么其实就是如果比栈顶大,那么栈顶就是需要的,并且进栈; 如果比栈顶小,那么其实栈顶可以pop了,因为栈顶用不着了,使用栈的目的是要保留比栈顶小的。还是要看需求。

O(N)时间复杂度解决~~

左边就从左边开始,如果比上一个小,那么上一个弹出…
右边就从右边开始,如果比上一个大,放入,小也弹出之前的.

# 反正记住优先队列就是有进有出~~这么思考
class Solution:
    def foundMonotoneStack(self , nums ):
        # write code here
        # 左边就从左边开始,如果比上一个小,那么上一个弹出...
        # 右边就从右边开始,如果比上一个大,放入,小也弹出之前的.
        stack = []
        result1 = []
        result2 = []
        for i in range(len(nums)):
            if i == 0:
                result1.append(-1)
            else:
                if nums[i] > nums[stack[-1]]:
                    result1.append(stack[-1])
                else:
                    while stack and nums[i] < nums[stack[-1]]:
                        stack.pop()
                    if stack:
                        result1.append(stack[-1])
                    else:
                        result1.append(-1)
            stack.append(i)
        stack = []
        for i in range(len(nums)-1, -1, -1):
            if i == len(nums) - 1:
                result2.append(-1)
            else:
                if nums[i] > nums[stack[-1]]:
                    result2.append(stack[-1])
                else:
                    while stack and nums[i] < nums[stack[-1]]:
                        stack.pop()
                    if stack:
                        result2.append(stack[-1])
                    else:
                        result2.append(-1)
            stack.append(i)
        results = []
        n = len(result1)
        for i in range(len(result1)):
            results.append([result1[i], result2[n-1-i]])
        return results

每日温度

在这里插入图片描述

### 记录还没有解决的,如果更小了,记录;当前i肯定是要记录的,但是i可以帮忙消除许多~~
class Solution:
    def dailyTemperatures(self, T):
        if not T:
            return []
        result = [0] * len(T)
        stack = [0]
        for i in range(1, len(T)):
            while stack and  T[i] > T[stack[-1]]:
                index = stack.pop()
                result[index] = i - index
            stack.append(i)
        return result

下一个更大的元素

y



class Solution:
    def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
        stack = []
        if not nums1:
            return []
        res = [-1] * len(nums2)
        for i in range(len(nums2)):
            if not stack:
                stack.append(i)
            else:
                while stack and  nums2[i] > nums2[stack[-1]]:
                    index = stack.pop()
                    res[index] = i
                stack.append(i)
        record = {}
        for i in range(len(nums1)):
            record[nums1[i]] = 1
        for i in range(len(nums2)):
            if nums2[i] in record:
                record[nums2[i]] = i
        result = []
        for i in range(len(nums1)):
            if res[record[nums1[i]]] != -1:
                result.append(nums2[res[record[nums1[i]]]])
            else:
                result.append(-1)
        return result



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值