054 Spiral Matrix[M]

1 题目描述

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

题目难度:Medium

2 题目样例

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].

3 题意分析

给定一个矩阵,按照一个内卷螺旋型的顺序返回矩阵中的元素。

(说实话,当我把题目读完我就觉得这题很烂,因为感觉在思路上并无革新之处。)

4 思路分析

思路很直观,只要一张草稿纸就能理清。先向右,再向下,再向左,再向上。之后重复上述步骤。

例如对于一个5*3的矩阵,只需要进行下述步骤,即可得到一个螺旋型输出的矩阵:

  • 向右走5格。
  • 向下走2格。
  • 向左走4格。
  • 向上走1格。
  • 向右走3格。

对于左右的移动,每次移动的格子数为5->4->3。

对于上下的移动,每次移动的格子数为2->1->0。

因此,我们可以利用方向矩阵记录所有方向的偏移量。然后使用两个元素的数组分别存储左右和上下的偏移数量。如此我们只需要使用一个循环(这是简化代码的最佳方式,按照常规写法,应该有4条循环语句)就能达到目的。

代码实现如下:

class Solution 

{
    
public:
    
    vector<int> spiralOrder(vector<vector<int>>& matrix) 
    
    {
        vector<vector<int> > dirs{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        
        vector<int> res;
        
        int nr = matrix.size();     
        
        if (nr == 0) 
            
            return res;
        
        int nc = matrix[0].size();  
        
        if (nc == 0) 
            
            return res;
    
        vector<int> nSteps{nc, nr-1};
    
        int iDir = 0;
        
        int ir = 0, ic = -1;
        
        while (nSteps[iDir%2]) 
            
        {
            for (int i = 0; i < nSteps[iDir%2]; ++i) 
            
            {
                
                ir += dirs[iDir][0]; ic += dirs[iDir][1];
                
                res.push_back(matrix[ir][ic]);
                
            }
            
            nSteps[iDir%2]--;
            
            iDir = (iDir + 1) % 4;
        }
        
        return res;
        
    }
};

5 后记

很奇怪的一件事是,我在用服务器代理的时候提交代码出现了Unknown error,但是在直接连接的时候则一切正常并且AC,为什么会这样呢?

    原文作者:Lolita
    原文地址: https://zhuanlan.zhihu.com/p/34797950
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞