leetcode-54-螺旋矩阵

题目描述:

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]

示例 2:

输入:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]

 

要完成的函数:

vector<int> spiralOrder(vector<vector<int>>& matrix) 

 

说明:

1、这道题给定一个二维的vector,里面存放着m个一维vector,每个一维vector有n列。可以看成是一个矩阵。

要求按照顺时针螺旋顺序,读取矩阵中的数值。

并把读取出来的数值,存放在一个一维的vector中,最后返回这个一维的vector。

 

2、这道题不难,按照一贯做法,把矩阵分层,外层、内层、再内层……每一层读取四条边上的数值。

代码如下:(附详解)

    vector<int> spiralOrder(vector<vector<int>>& matrix) 
    {
        if(matrix.size()==0)return {};//边界情况,如果matrix中没有元素
        int s1=matrix[0].size(),s2=matrix.size(),count=0;//s1代表列数,s2代表行数
        vector<int>res(s1*s2,0);//提前申请好空间,节省多次申请空间花费的时间
        for(int k=0;k<=(min(s1,s2)-1)/2;k++)//k代表当前处于哪一层
        {
            for(int i=k;i<s1-k;i++)//读取当前层最上面的边的数值
            {
                res[count]=matrix[k][i];
                count++;
            }
            for(int i=k+1;i<s2-k;i++)//读取当前层最右边的边的数值
            {
                res[count]=matrix[i][s1-k-1];
                count++;
            }
            if(s2-1-k!=k)//如果当前层最下面的边跟最上面的边,不是同一条边
            {
                for(int i=s1-2-k;i>=k;i--)//那么再读取当前层最下面的边的数值
                {
                    res[count]=matrix[s2-1-k][i];
                    count++;
                }
            }
            if(k!=s1-k-1)//如果当前层最左边的边跟最右边的边,不是同一条边
            {
                for(int i=s2-2-k;i>=k+1;i--)//那么再读取当前层最左边的边
                {
                    res[count]=matrix[i][k];
                    count++;
                }  
            }  
        }
        return res;//最后返回一维的vector
    }

这道题笔者自己在写代码的时候,在边界条件上出了错误。最开始没有注意到最下面的边可能跟最上面的边,是同一条边的这种情况。

如果没有加以特殊处理,会出现res这个vector的赋值错误,超过了申请的空间。

如果不是先申请空间而是每次不断地插入的话,可能会重复读取,并且顺序上也有问题。

上述代码实测0ms,beats 100.00% of cpp submissions。

posted @ 2018-08-15 21:04  chenjx85  阅读(338)  评论(0编辑  收藏  举报