zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    注册登录
    ASP.NET常用编程代码(一)
    HTML、CSS、JS、PHP 的学习顺序~(零基础初学者)
    如何学习javascript?(转)
    如何完全卸载SQL Server 2005
    如何给网页标题栏上添加图标(favicon.ico)
    网页制作常用代码
    网页颜色代码对照表
    ASP.NET常用编程代码(二)
    50个PHOTOSHOP快捷键技能!
  • 原文地址:https://www.cnblogs.com/chenjx85/p/9484008.html
Copyright © 2011-2022 走看看