【劍指offer{19-22}】順時針列印矩陣、包含min函式的棧、棧的壓入彈出序列、從上往下列印二叉樹
阿新 • • 發佈:2018-12-13
順時針列印矩陣、包含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;
}
};