题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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++旋转矩阵甚麻烦)。打算半个小时的题花了2个小时。

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        vector<int> v;
        int height = matrix.size();
        int width = matrix[0].size();
        int i=0, j=0, layer=1;
        for(int t=0;t<height*width;){
            for(;j<=width-layer;++t,++j)
                v.push_back(matrix[i][j]);
            i++;j--;
            if(t==height*width) //防止极端情况的
                break;
            for(;i<=height-layer;++t,++i)
                v.push_back(matrix[i][j]);
            i--;j--;
            if(t==height*width) //防止极端情况的
                break;
            for(;j>=layer-1;++t,--j)
                v.push_back(matrix[i][j]);
            i--;j++,layer++;
            if(t==height*width)//防止极端情况的
                break;
            for(;i>=layer-1;++t,--i)
                v.push_back(matrix[i][j]);
            i++;j++;
            if(t==height*width)//防止极端情况的,其实真正的极端情况只有这里会
                break;
        }
        return v;
    }
};

极端情况靠计数结束防止,出现极端情况的肯定是已经结束了(触碰边界)
旋转矩阵思路(一个班小时。。,py多容易。。)

class Solution {
public:
    vector<vector<int>> rotate(vector<vector<int>> v){
        vector<vector<int>> map;
        if(v.empty())
            return map;
        for(int i=v[0].size()-1;i>=0;--i){
            vector<int> row;
            for(int j=0;j<v.size();++j){
                row.push_back(v[j][i]);
            }
            map.push_back(row);
        }
        return map;
    }
    vector<int> printMatrix(vector<vector<int> > matrix){
        vector<int> v;
        while(!matrix.empty()){
            for(int i=0;i<matrix[0].size();++i){
                v.push_back(matrix[0][i]);
            }
            matrix.erase(matrix.begin());
            matrix = rotate(matrix);
        }
        return v;
    }
};