算法康复训练14


1. 知识点总结

题目 难度 知识点
不同的搜索二叉树 🐸 二叉树
中序遍历二叉树 🐸 二叉树的中序遍历
最大矩形 🐸🐸🐸 单调栈

不可以😪!!明明早上有多睡哎!

2. 分题题解

2.1 中序遍历二叉树

emm这个不难哈,不记得的话回去复习数据结构

2.2 最大矩形

参考上一篇的柱状图中最大矩形 的官方题解,对每一列运用单调栈即可

class Solution {
public:
    
    int maximalRectangle(vector<vector<char>>& matrix) {
        int row,col;
        row=matrix.size();
        if(row==0){
            return 0;
        }else{
            col=matrix[0].size();
            vector<vector<int> >bars(row,vector<int>(col));
            //初始化bars
            for(int i=0;i<row;i++){
                fill(bars[i].begin(),bars[i].end(),0);
                for(int j=0;j<col;j++){
                    if(matrix[i][j]=='1'){
                        if(j){
                            bars[i][j]=bars[i][j-1]+1;
                        }else{
                            bars[i][j]=1;
                        }
                    }
                }
            }
            //复用最大矩形的模板
            int ans=0;
            for(int i=0;i<col;i++){
                stack<int>st;
                vector<int>up(row,0),down(row,0);
                for(int j=0;j<row;j++){
                    while(!st.empty()&&bars[st.top()][i]>=bars[j][i]){
                        st.pop();
                    }
                    up[j]=st.empty()?-1:st.top();
                    st.push(j);
                }
                while(!st.empty()){
                    st.pop();
                }
                for(int j=row-1;j>=0;j--){
                    while(!st.empty()&&bars[st.top()][i]>=bars[j][i]){
                        st.pop();
                    }
                    down[j]=st.empty()?row:st.top();
                    st.push(j);
                }
                //对于每一列单调栈求最大的矩形
                int max_size=0;
                for(int k=0;k<row;k++){
                    max_size=max((down[k]-up[k]-1)*bars[k][i],max_size);
                }
                ans=max(max_size,ans);
            }
            return ans;
        }
    }
};

2.3 搜索不同的二叉树

找规律的一道题,看数据量哈,暴力即可

class Solution {
public:
    
    int numTrees(int n) {
        if(n<=2){
            return n;
        }else{
            vector<int>v(n+1);
            v[0]=1;
            v[1]=1;
            v[2]=2;
            for(int i=3;i<=n;i++){
                for(int j=i-1;j>=0;j--){
                    v[i]+=v[j]*v[i-1-j];
                   
                }
                
            }
            return v[n];
        }
    }
};

3. 参考资料

上一篇单调栈嗷!


文章作者: Gao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Gao !
评论
  目录