剑指29题顺时针打印矩阵题解

题目

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

示例:

输入

matrix = [[1,2,3],[4,5,6],[7,8,9]]

输出

[1,2,3,6,9,8,7,4,5]

题解思路

针对这种模拟类型的题目,首先要确定是否需要控制条件,若需要则在模拟的外部先定好外部控制条件,若不需要,则不用设定外部控制条件,随后进行过程模拟,得出结果。 针对本题,过程如下:

  1. 设定外部四个边界,above,below,right,left,用于控制模拟过程的返回以及终止。
  2. 利用while死循环模拟顺时针打印的过程,同时在循环中,需要对边界的值进行改变,如向下缩小一圈则above--,直到有边界越界,则结束循环,获取到所有的值存储在数组v中。

代码如下

class Solution {
public:
    int row;
    int column;

    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> v;

        if(matrix.empty())
            return v;

        int above = 0;
        int below = matrix.size() - 1;
        int left = 0;
        int right = matrix[0].size() - 1; 

        while(true){
            for(int i = left;i <= right;i++)
                v.push_back(matrix[above][i]);
            if(++above > below)
                break;
            for(int i = above;i <= below;i++)
                v.push_back(matrix[i][right]);
            if(--right < left)
                break;
            for(int i = right;i >= left;i--)
                v.push_back(matrix[below][i]);
            if(--below < above)
                break;
            for(int i = below;i >= above;i--)
                v.push_back(matrix[i][left]);
            if(++left > right)
                break;
        }
        return v;
    }
};

一点感悟

在我看来,其实递归,dfs,模拟本质上是有关系的,他们的关系大致如下:

模拟关系图

end

评论