第五十九天|单调栈

文章详细介绍了LeetCode中的两道难题,503号问题NextGreaterElementII使用循环和单调栈解决,42号问题TrappingRainWater提供了bruteforce、双指针和单调栈三种解法,展示了不同的算法思路。
摘要由CSDN通过智能技术生成

今天的题有点难

503. Next Greater Element II

首先这是一个循环cycle的问题,解决这个问题的方法就是copy一遍num到num里面,然后正常的用单调栈去找next greater value就行

class Solution:
    def nextGreaterElements(self, nums: List[int]) -> List[int]:
        res=[-1 for _ in range(len(nums))]
        stack=[]
        for i in range(len(nums)*2):
            while len(stack)!=0 and nums[i%len(nums)]> nums[stack[-1]]:
                res[stack[-1]]=nums[i%len(nums)]
                stack.pop()
            stack.append(i%len(nums))
        return res

42. Trapping Rain Water

这道题比较难.我们先从最简单的方法入手

Way1:

如果是brute force 的话就是想着算每一列所加的水,那么基本思路就是用for循环,对于每一列要找到他的左侧和右侧的最大值,然后确定当前列的值

Way2:

用双指针法可以优化上一个方法.基本思路就是左右两个指针分别指向第一个和最后一个index,然后比较index 对应的value来确定移动那边(移动小的一边).额外要用两个变量存左右边的最大值用来后续的计算

class Solution:
    def trap(self, height: List[int]) -> int:
        l=0
        r=len(height)-1
        max_l=max_r=0
        res=0
        while l < r:
            if height[l] < height[r]:
                if height[l] >= max_l:
                    max_l = height[l]
                else:
                    res+=max_l-height[l]
                l+=1
            else:
                if height[r] >= max_r:
                    max_r = height[r]
                else:
                    res+=max_r-height[r]
                r-=1
        return res

Way3:

第三种就是用单调栈,基本思路还是上述思路,只不过用单调栈去实现.即nums[i]如果比当前stack的最后一个index对应的值小,则把i放入stack.如果一样则pop上一个存当前的.如果大则不断取出根据左右边界算出值(w*h)

class Solution:
    def trap(self, height: List[int]) -> int:
        res=0
        stack=[0]
        for i in range(1,len(height)):
            if height[i]<height[stack[-1]]:
                stack.append(i)
            elif height[i]==height[stack[-1]]:
                stack.pop()
                stack.append(i)
            else:
                while len(stack)!=0 and height[i]>height[stack[-1]]:
                    mid=height[stack[-1]]
                    stack.pop()
                    if stack:
                        l=height[stack[-1]]
                        r=height[i]
                        h=min(r,l)-mid
                        w=i-stack[-1]-1
                        res+=h*w
                stack.append(i)
        return res

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值