当前位置 博文首页 > 菜鸟学编程:NC38-螺旋矩阵

    菜鸟学编程:NC38-螺旋矩阵

    作者:[db:作者] 时间:2021-06-13 18:29

    一、题目

    给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。

    示例1

    输入

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

    返回值

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

    二、题解

    先考虑矩阵为方阵的情况(m==n),定义边界值:left,right,top,bottom,遍历方向(从左向右、从上向下、从右向左、从下向上)

    然后考虑特殊情况,如矩阵为空,矩阵为以下两种case,需要加条件限定,否则输出结果不对

    case1:

    1? 2? ? 3? ? ?4

    5? 6? ? 7? ? ?8

    9? 10? 11? 12

    case2:

    1? ? 2? ? 3

    5? ? 6? ? 7

    9? ?10? 11?

    13 14? 15

    17 18? 19

    class Solution {
    public:
        vector<int> spiralOrder(vector<vector<int> > &matrix) {
            vector<int> res;
            int m = matrix.size();
            int n = matrix[0].size();
            if(m==0 || n==0) return res;//数组为空
            
            int left = 0,right = n-1;
            int top = 0,btm = m-1;
            while(left<=right && top<=btm){
                //从左往右遍历
                for(int i=left;i<=right;i++){
                    res.push_back(matrix[top][i]);
                }
                //从上往下遍历
                for(int j=top+1;j<=btm;j++){
                    res.push_back(matrix[j][right]);
                }
                //从右往左遍历
                if(top < btm){//case:[[1,2,3,4],[5,6,7,8],[9,10,11,12]],不加if判断时输出[1,2,3,4,8,12,11,10,9,5,6,7,6],因为满足for的条件,执行循环体后,结果中多了个6
                    for(int k=right-1;k>=left;k--){
                        res.push_back(matrix[btm][k]);
                    }
                }
                //从下往上遍历
                if(left < right){//case:[[1,2,3],[5,6,7],[9,10,11],[13,14,15],[17,18,19]],不加if判断时输出[1,2,3,7,11,15,19,18,17,13,9,5,6,10,14,10,14],因为满足for的条件,多输出10,14
                    for(int m=btm-1;m>top;m--){
                        res.push_back(matrix[m][left]);
                    }
                }
                
                top++;
                btm--;
                left++;
                right--;
            }
            return res;
        }
    };

    ?

    下一篇:没有了