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) {
                stackst;
                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;
            }
        };