顺时针打印矩阵、包含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;
}
};