美文网首页
顺时针打印矩阵

顺时针打印矩阵

作者: HamletSunS | 来源:发表于2019-07-29 21:31 被阅读0次

    思路:

    • 可以先画个图,自己模拟一下,有个直观感受,然后找一找规律
    • 要求顺时针打印,只要行数和列数>=1即可满足打印条件,可以直接通过4个变量保存好上下左右的边界,可以发现每顺时针遍历一圈,上下左右的边界会向内推进1,直到 上边界的行号大于下边界的行号 或者 左边界的列位于有边界的列的右侧,说明打印完成。再通俗些说,当边界围成的范围只有一行或一列时,就是最后一次打印了。
    • 按照顺时针顺序打印,那么有:
      1. 从左到右,只要左边界小于等于右边界即可打印
      2. 从上到下,只要上边界小于下边界即可打印
      3. 从右到左,首先比较明显的条件是左边界小于右边界,但我们要注意在步骤1中我们已经打印了一行,所以再次横向打印时我们还应该保证跟步骤1打印的不是同一行。不是同一行的话就要求步骤2执行,因此想执行步骤3还需要满足步骤2的条件。
        简单来说,从右到左打印的条件是左边界小于右边界(因为要横向打印)和上边界小于下边界(保证跟1打印的不是同一行)
      4. 从下到上打印,分析同3,可以知道也需要满足2个条件才可以执行打印,这2个条件是上边界小于下边界,左边界小于有边界
    class Solution {
    public:
        vector<int> printMatrix(vector<vector<int> > matrix) {
            vector<int> ret;
            int row=matrix.size();
            if(row==0)
                return ret;
            int col=matrix[0].size();
            if(col==0)
                return ret;
            
            int left=0,right=col-1,top=0,bottom=row-1;
            while(left<=right && top<=bottom){
                //left -> right
                for(int i=left;i<=right;++i)
                    ret.push_back(matrix[top][i]);
                //top->bottom
                for(int i=top+1;i<=bottom;i++)
                    ret.push_back(matrix[i][right]);
                //right->left
                if(top<bottom){
                    for(int i=right-1;i>=left;i--)
                        ret.push_back(matrix[bottom][i]);
                }
                
                //bottom->top
                if(left<right){
                    for(int i=bottom-1;i>=top+1;i--)
                    ret.push_back(matrix[i][left]);
                }
                
                left++;
                right--;
                top++;
                bottom--;
            }
            return ret;
        };    
    };
    

    相关文章

      网友评论

          本文标题:顺时针打印矩阵

          本文链接:https://www.haomeiwen.com/subject/dxgirctx.html