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)

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

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

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

你可能感兴趣的:(算法,leetcode,数据结构)