Spiral Matrix - LeetCode 54

题目描述:
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

For example,
Given the following matrix:

[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
You should return [1,2,3,6,9,8,7,4,5].
Tags: Array

分析:
由之前的Rotate Image(http://blog.csdn.net/bu_min/article/details/45749429)题目的启示,本题可以通过一层一层往里剥,但是怎么获取每次打印的下标呢?
暴力法:处理每一层的时候,记录四边形对角两个节点的行列号,这就把这一层的行列坐标范围给记住了,每一层处理完之后,将对角节点坐标更新,往里挪一层。
此题陷阱有点多:
1、需要注意,此题的矩阵式M x N,行数和列数不一样,因此求层数的范围时候,应该用min(M,N)来计算。

2、在;螺旋顺序打印的时候,注意下标处理,当M>N时,最后两个标记节点的行坐标相等;若M<N,最后两个标记节点的列坐标相等,应单独处理这两个情况。

以下是C++实现代码,附注释。

/*2ms//*/
class Solution {
 
public:
   struct node /**定义node结构,用于存储每一层的两个对角节点*/
    {
        int x;
        int y;
        node(int _x,int _y):x(_x),y(_y){}
    };

    int min(int m,int n)
    {
        return m < n? m : n;
    }

    vector<int> spiralOrder(vector<vector<int>>& m) {
        vector<int> vec;
         if(m.empty())
            return vec;
        
        int m_size = m.size();
        int n_size = m[0].size();
       
        node up(0,0);
        node down(m_size-1,n_size-1);
        int lay = min(m_size,n_size)/2;
        while(lay--) /*循环处理每一层*/
        {
            for(int j = up.y;j<down.y;j++) /*从左到右处理上边*/
            {
                vec.push_back(m[up.x][j]);
            }
            for(int i = up.x;i < down.x;i++) /*从上到下处理右边*/
            {
                vec.push_back(m[i][down.y]);
            }
            for(int j = down.y;j >up.y;j--) /*从右到左处理下边*/
            {
                vec.push_back(m[down.x][j]);
            }
            for(int i = down.x;i > up.x;i--) /*从下到上处理左边*/
            {
                vec.push_back(m[i][up.y]);
            }
		
            /*更新对角节点*/
            up.x++;
            up.y++;
            down.x--;
            down.y--;
        }
        
        if(up.y == down.y)  /*处理M>N的情况*/
        {
            for(int i = up.x;i <= down.x;i++)
            {
                vec.push_back(m[i][up.y]);
            }
        }
        else if(up.x == down.x)  /*处理M<N的情况*/
        {
            for(int j = up.y; j <= down.y; j++)
            {
                vec.push_back(m[up.x][j]);
            }
        }
        
        return vec;
    }
};



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值