1.顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
思路:规定一个start代表要做的循环圈数。例如如果是4*4的矩阵,就只需要打印两圈。每圈打印时,安装第一行从左往右、最后一列从上往下,最后一行从左往右,第一列从上往下的顺序执行。注意打印时循环执行的条件(画图)。

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        int start=0;     
        vector<int> result;
        if(matrix.size()==0||matrix[0].size()==0) return result;
        int row=matrix.size();//行
        int col=matrix[0].size();//列
        while(row>start*2&&col>start*2)
        {
        int endX=col-1-start;//横坐标,x轴,横向
        int endY=row-1-start;//纵坐标,y轴,纵向
        for(int i=start;i<=endX;i++)
        {
            result.push_back(matrix[start][i]);//第一行从左往右,纵坐标为start,横坐标[start,endX]
        }
        if(endY>start)
        {
            for(int i=start+1;i<=endY;i++)
            {
                result.push_back(matrix[i][endX]);//最后一列从上往下,横坐标endX,纵坐标[start+1,endY]
            }
        }
        if(endX>start&&endY>start)
        {
            for(int i=endX-1;i>=start;i--)
            {
                result.push_back(matrix[endY][i]);//最后一行从左往右,纵坐标endY,横坐标[endX-1,start]
            }
        }
        if(endX>start&&endY>start+1)
        {
            for(int i=endY-1;i>=start+1;i--)
            {
                result.push_back(matrix[i][start]);//最后一列从下往上,横坐标start,纵坐标[endY-1,start+1]
            }
        }
            start++;//决定打印几圈
        }
        return result;
    }
};

2.包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。
思路:定义两个栈s1与sMin,当进行push操作时,如果push进的新数小于sMin的栈顶,就压入新的最小值,否则压入旧的最小值(因为要保证两个栈的元素数目同时增减)。注意pop操作与min操作时的判断条件,只有二者都非空时才可执行。

class Solution {
public:
    stack<int> s1,sMin;
    void push(int value) {
        s1.push(value);
        if(sMin.size()==0||value<sMin.top())
            sMin.push(value);//有新的最小值,压入新的最小值
        else
            sMin.push(sMin.top());//没有,压入旧的最小值
    }
    void pop() {
        if(s1.size()>0&&sMin.size()>0)
        {
            s1.pop();
            sMin.pop();
        }
    }
    int top() {
        return s1.top();
    }
    int min() {
        if(s1.size()>0&&sMin.size()>0)
        {
            return sMin.top();
        }
    }
};