42. 接雨水
?做题思路or感想:
-
先说感想:二刷的我又对这道题写了一个小时,可恶
-
这道题用单调栈比较好理解
-
用单调栈来储存下标!用下标来计算宽度,用
height[i]
来算高度 -
要保持单调栈递减的状态,符合题意
-
当
height[i]
=height[st.top()]
,则要替换掉栈顶的元素,因为这里是需要用最右的柱子下标来计算宽度的 -
当
height[i] < height[st.top()]
,则入栈 -
当
height[i] > height[st.top()]
,则说明形成凹槽,可以计算class Solution { public: int trap(vector
& height) { stack st; int sum = 0; st.push(0); for (int i = 1; i < height.size(); i++) { if (height[i] == height[st.top()]) { //情况一 st.pop(); st.push(i); } else if (height[i] < height[st.top()]) { //情况二 st.push(i); } else { //情况三 //这里是while!而且是height[i] > height[st.top()]!!! while (!st.empty() && height[i] > height[st.top()]) { int mid = st.top(); st.pop(); if (!st.empty()) { //这里最左边不能是空的,故!st.empty() //计算h,w,进而计算雨水面积 int h = min(height[i], height[st.top()]) - height[mid]; int w = i - st.top() - 1; sum += h * w; } } st.push(i);//把雨水收集完了以后,别忘了入栈!!! } } return sum; } };
-
-