day 59 503.下一个更大元素II 42. 接雨水

day 59 503.下一个更大元素II 42. 接雨水_第1张图片

vector的扩充要熟悉

vector numsT(nums.begin(),nums.end());

 nums.insert(nums.end(),numsT.begin(),numsT.end());

class Solution {
public:
    vector nextGreaterElements(vector& nums) {
        stack st;
        
        vector numsT(nums.begin(),nums.end());
        nums.insert(nums.end(),numsT.begin(),numsT.end());
        vector res(nums.size(),-1);
        st.push(0);
        int index=1;
        while(!st.empty()&&indexnums[st.top()]){
                res[st.top()]=nums[index];
                st.pop();
            }
            st.push(index);
            index++;
            
        }
        return vector (res.begin(),res.begin()+numsT.size());
        
    }
};

vector.resize()-》

result.resize(nums.size() / 2);

可以模拟走了两遍数组 

day 59 503.下一个更大元素II 42. 接雨水_第2张图片

不知道咋转为单调栈

题解:代码随想录

按照列计算,这样只要计算高度。有多种解法,首先是双指针解法,对于每个位置,遍历最右边和最左边最高高度,找到两者最小值-本列高度,就能得到当前装的雨水高度。更进一步是,每列的左侧最高高度转为左边一列的左侧最高高度和左侧一列的高度最大值,右侧类似,减少重复计算。

maxLeft[i] = max(height[i], maxLeft[i - 1]);

单调栈解法:是按行做

要用单调增的单调栈,如果新加的元素比栈头大,栈头就是底部,栈头左边是最近的比他高的左边柱子。因为我们要求宽度的时候 如果遇到相同高度的柱子,需要使用最右边的柱子来计算宽度,所以相同值要替换下标。栈里保存下表,通过长*宽算雨水体积。

一次wa是因为stack弹出元素后要取栈顶元素之有特判stack是否为空

class Solution {
public:
    int trap(vector& height) {
        stack  st;
        st.push(0);
        int index=1;
        if(height.size()<=2){
            return 0;
        }
        int sum=0;
        while(!st.empty()&&indexheight[st.top()]){
                int mid=st.top();
                st.pop();
                if(! st.empty()){
                int h=min(height[index],height[st.top()])-height[mid];
                int w=index-st.top()-1;
                sum+=h*w;
                }

            }
            st.push(index);
            index++;
        }
        return sum;

    }
};

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