1. 程式人生 > >【劍指offer{19-22}】順時針列印矩陣、包含min函式的棧、棧的壓入彈出序列、從上往下列印二叉樹

【劍指offer{19-22}】順時針列印矩陣、包含min函式的棧、棧的壓入彈出序列、從上往下列印二叉樹

順時針列印矩陣、包含min函式的棧、棧的壓入彈出序列、從上往下列印二叉樹

順時針列印矩陣

題目描述

  • 輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下4 X 4矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

C++程式碼

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        int row=matrix.size();
        int col=matrix[0].size();
        vector<int> res;
        int circle=((row<col?row:col)-1)/2+1;
        for (int i=0;i!=circle;i++)
        {
            //從左到右
            for (int j=i;j!=col-i;j++){
                res.push_back(matrix[i][j]);
            }
            //從上到下
            for(int k=i+1;k!=row-i;k++){
                res.push_back(matrix[k][col-i-1]);
            }
            //從右到左
            for(int m=col-i-2;(m>=i)&&(row-i-1!=i);m--){
                res.push_back(matrix[row-i-1][m]);
            }
            //從下往上
            for (int n=row-i-2;(n>i)&&(col-i-1!=i);n--){
                res.push_back(matrix[n][i]);
            }
        }
        return res;
    }
};

包含min函式的棧

題目描述

  • 定義棧的資料結構,請在該型別中實現一個能夠得到棧中所含最小元素的min函式(時間複雜度應為O(1))。

C++程式碼

class Solution {
public:
    stack<int>minSt;
    stack<int>st;
    void push(int value) 
    {
        st.push(value);
        if(minSt.empty())
        {
            minSt.push(value);
        }
        else
        {
            if(value<minSt.top())
            {
                 minSt.push(value);
            }
            else
            {
                minSt.push(minSt.top());
            }
        }
        return;
    }
    void pop() 
    {
        if(!st.empty())
        {
            st.pop();
            minSt.pop();
        }
        return;
    }
    int top() 
    {
       if(!st.empty())
       {
           return st.top();
       }
        return 0;
    }
    int min() 
    {
        if(!minSt.empty())
        {
            return minSt.top();
        }
        return 0;
    }
};

棧的壓入彈出序列

題目描述

  • 輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)

C++程式碼

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) 
    {
        if(pushV.size()==0)
        {
            return false;
        }
        stack<int>sta;
        int j = 0;
        for(int i = 0;i<pushV.size();i++)
        {
            sta.push(pushV[i]);
            while(j<popV.size() && popV[j]==sta.top())
            {
                sta.pop();
                j++;
            }
        }
        return sta.empty();
    }
};

從上往下列印二叉樹

題目描述

  • 從上往下打印出二叉樹的每個節點,同層節點從左至右列印。

C++程式碼

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
    vector<int> PrintFromTopToBottom(TreeNode* root) 
    {
        vector<int>res;
        if(root==NULL)
        {
            return res;
        }
        queue<TreeNode*>que;
        que.push(root);
        while(!que.empty())
        {
            int size = que.size();
            for(int i = 0;i<size;i++)
            {
                TreeNode *temp = que.front();
                res.push_back(temp->val);
                que.pop();
                if(temp->left!=NULL)
                {
                    que.push(temp->left);
                }
                if(temp->right!=NULL)
                {
                    que.push(temp->right);
                }
            }
        }
        return res;
    }
};