代码随想录算法训练营day59|503.下一个更大元素II42.接雨水

503.下一个更大元素II

题目链接

方法一:直接把两个nums数组拼接在一起,然后进行计算。

class Solution {
public:
    vector nextGreaterElements(vector& nums) {
        int len=nums.size();
        nums.insert(nums.end(),nums.begin(),nums.end());
        stack st;
        vector res(nums.size(),-1);
        st.push(0);
        for(int i=1;inums[st.top()]){
                    res[st.top()]=nums[i];
                    st.pop();
                }
                st.push(i);
            }
        }
        res.resize(len);
        return res;     
    }
};

注意拼接数组的用法。 

方法二:用%操作来模拟环。

class Solution {
public:
    vector nextGreaterElements(vector& nums) {
        int len=nums.size();
        stack st;
        vector res(nums.size(),-1);
        st.push(0);//又出错,存的是下标
        for(int i=1;inums[st.top()]){
                    res[st.top()]=nums[i%len];
                    st.pop();
                }
                st.push(i%len);//同样的错误,要存放下标,不是元素
            }
        }
        return res;
    }
};

42.接雨水 

题目链接

用单调栈来做,具体思路参考卡哥讲解。

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

你可能感兴趣的:(算法,leetcode,c++)