Day63 503.下一个更大元素II ,42. 接雨水

503.下一个更大元素II

        为了达到循环遍历的目的(即让后面的数也能看到前面的数),可以直接拓展数组(或者跑两次)来达到目的

        n = len(nums)
        nums = nums + nums
        tmp = [len(nums) - 1]

        然后就跟每日温度一样,维护单调栈得结果即可 (保存原长度可有可无)

        for i in range(len(nums) - 2, -1, -1):
            while tmp and nums[i] >= nums[tmp[-1]]:
                tmp.pop()
            if tmp:
                ans.append(nums[tmp[-1]])
            else:
                ans.append(-1)
            tmp.append(i)
        return ans[::-1][:n]

42. 接雨水 

        接雨水用单调栈的思想可以很容易的发现问题所在,当前单元格能取到的高度只能是左边第一个较大的和右边第一个较大的最小值,解决这个问题就是关键步骤

        解决方法:设置临时数组,在遍历的过程中将当前值改成所得到的较大值,这样可以让未遍历到的值也能得到较大值

        tmp1 = height.copy()
        n = len(height)
        stack = [n - 1]
        for i in range(n - 2, -1, -1):
            while stack and tmp1[i] >= tmp1[stack[-1]]:
                stack.pop()
            if stack:
                tmp1[i] = tmp1[stack[-1]]
            stack.append(i)

        再进行一次从左向右遍历,最后取较小值就可以得到雨水值

        临时数组不一定要复制,也可以为空 

        通过设置两个结束数组,直接添加,也能得到临时数组的效果(其实理解起来差不多哈哈哈)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值