代码随想录day59

503.下一个更大元素II 

单调栈的本质是空间换时间。

可以用insert将两个数组拼接在一起,然后再用单调栈求解,最后再resize数组的大小即可,其中resize是O(1)的操作,用insert扩充数组是O(N)的操作,所以我们用取余的操作即可。

class Solution {
public:
    vector nextGreaterElements(vector& nums) {
        vector res(nums.size(),-1);
        if(nums.size()==0) return res;
        stack st;
        st.push(0);
        for(int i=1;i<2*nums.size();i++){
            if(nums[i%nums.size()]<=nums[st.top()]){
                st.push(i%nums.size());
            }else{
                while(!st.empty()&&nums[i%nums.size()]>nums[st.top()]){
                    res[st.top()]=nums[i%nums.size()];
                    st.pop();
                }
                st.push(i%nums.size());
            }
        }
        return res;
    }
};

42. 接雨水  

暴力解法(双指针),按照列来计算,遍历每一列的时候,还要向两边寻找最高的列,所以时间复杂度是O(n^2),超时了。

//注意到第一个柱子和最后一个柱子不接雨水
class Solution {
public:
    int trap(vector& height) {
        int sum=0;
        for(int i=0;irh) rh=height[r];
            }
            for(int l=i-1;l>=0;l--){
                if(height[l]>lh) lh=height[l];
            }
            int h=min(lh,rh)-height[i];
            if(h>0) sum+=h;
        }
        return sum;
    }
};

用数组进行优化:

把每一个位置的左边最高高度记录在数组maxleft上,右边最高高度记录在数组maxright上。

class Solution {
public:
    int trap(vector& height) {
        if(height.size()<=2) return 0;
        vector maxleft(height.size(),0);
        vector maxright(height.size(),0);
        int size=height.size();
        maxleft[0]=height[0];
        for(int i=1;i=0;i--){
            maxright[i]=max(height[i],maxright[i+1]);
        }
        int sum=0;
        for(int i=0;i0) sum+=h;
        }
        return sum;
    }
};

单调栈:

理解的还不是很透彻。

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

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