1. 程式人生 > >劍指offer——19.順時針列印矩陣

劍指offer——19.順時針列印矩陣

題目描述:

輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下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.

解題思路:

每次起始位置為(0,0),(1,1),(2,2)……,由此i可推斷出結束位置,每次注意只有一行或者一列的情景。

參考原始碼:

class Solution {
public:
        vector<int> res;
    vector<int> printMatrix(vector<vector<int> > matrix)
    {
            if(matrix.size() == 0 && matrix[0].size() == 0)
            {
                    return res;
            }
            int mark = 0;
            int rows = matrix.size();
            int columns = matrix[0].size();
            while(mark <= (matrix.size()-1)/2 && mark <= (matrix[0].size()-1)/2)
            {
                    Helper(matrix,rows,columns,mark);
                    mark++;
            }
            return res;
    }  
    void Helper(vector<vector<int>> matrix,int rows,int columns,int mark)
    {  
            //向右
            if(columns-1-mark >= mark)
            {
                 for(int i = mark;i < columns-mark;i++)
                 {
                            res.push_back(matrix[mark][i]);
                 }
            }
            //向下
            if(rows-1-mark > mark)
            {
                 for(int i = mark+1;i < rows-mark;i++)
                 {
                            res.push_back(matrix[i][columns-mark-1]);
                 }
            }
            //向左
            if(rows-1-mark > mark && columns-1-mark > mark)
            {
                 for(int i = columns-mark-2;i >= mark;i--)
                 {
                            res.push_back(matrix[rows-mark-1][i]);
                 }
            }
            //向上
            if(rows-1-mark > mark+1 && columns-1-mark > mark)
            {
                 for(int i = rows-mark-2;i > mark;i--)
                 {
                      res.push_back(matrix[i][mark]);
                 }
            }
    }
};