代码随想录算法训练营第59天 | 503.下一个更大元素II 42. 接雨水

Source

一、Leetcode 503.下一个更大元素II

和739. 每日温度一样。区别在于需要遍历两遍nums数组。卡哥用的是i % nums.size(),我觉得两遍for循环也不是不行。

二、Leetcode 42. 接雨水

还是动态规划好用啊。
动态规划需要通过列来计算,当前列雨水面积 = min(左边柱子的最高高度,记录右边柱子的最高高度) - 当前柱子高度。
当前位置,左边的最高高度是前一个位置的左边最高高度和本高度的最大值。
即从左向右遍历:maxLeft[i] = max(height[i], maxLeft[i - 1]);
从右向左遍历:maxRight[i] = max(height[i], maxRight[i + 1]);

当然也搞个单调栈。
单调栈需要通过行来计算,当前行雨水面积 = 宽×高,
雨水高度是 min(凹槽左边高度, 凹槽右边高度) - 凹槽底部高度,代码为:int h = min(height[st.top()], height[i]) - height[mid];
雨水的宽度是 凹槽右边的下标 - 凹槽左边的下标 - 1(因为只求中间宽度),代码为:int w = i - st.top() - 1 ;