螺旋方向遍历矩阵

作者: vergilzhang | 来源:发表于2017-06-01 19:48 被阅读27次

leetcode 上有一道以螺旋方向遍历矩阵的题目https://leetcode.com/problems/spiral-matrix/#/description
题目描述如下:

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

像这种遍历的题一般都是有规律的,所以要解决这道题我们首先得找出遍历时坐标的规律。

设矩阵大小为 m×n.
我们假设当前坐标为 ( i , j ),起始时就是(0, 0),由于是螺旋前进,所以首先向右直到尽头,然后向下,然后向左,然后向上,最后又是右。所以方向上为【右,下,左,上】循环。

然后我们要考虑,每个方向的步长是多少:
第一圈:
向右前进 n 步。
向下前进 m - 1 步。
向左前进 n - 1 步。
向上前进 m - 2 步。

第二圈:
向右前进 n - 2 步。
向下前进 m - 3 步。
向左前进 n - 3 步。
向上前进 m - 4 步。

... ...

第i圈:
向右前进 n - i + 1步。
向下前进 m - i 步。
向左前进 n - i 步。
向上前进 m - i - 1 步。

将这个前进步长序列整理出来就是:
【n, m -1, n - 1, m -2, n -2, m -3, n -3, ......】
对应的前进方向的序列为:
【右, 下, 左, 上,右,下,左,.........】

整理为代码如下:

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<vector<int>> dirs{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};//RIGHT DOWN LEFT UP
        vector<int> res;
        int m = matrix.size();     if (m == 0) return res;
        int n = matrix[0].size();  if (n == 0) return res;
        vector<int> nSteps{n, m-1};
        int r = 0;
        int c = -1;
        int iDir = 0;
        while(nSteps[iDir%2]) {
            for(int i = 0; i < nSteps[iDir%2];++i) {
                r += dirs[iDir%4][0];
                c += dirs[iDir%4][1];
                cout << "r = " << r << " c = " << c << endl;;
                res.push_back(matrix[r][c]);
            }
            nSteps[iDir%2] --;
            iDir ++;
        }
        return res;
    }
};

相关文章

  • 螺旋方向遍历矩阵

    leetcode 上有一道以螺旋方向遍历矩阵的题目https://leetcode.com/problems/sp...

  • 螺旋矩阵

    螺旋矩阵 1.想法: 对于矩阵的螺旋我们可以规约为4个方向 2.代码:

  • 遍历螺旋矩阵算法

    同事说最近螺旋矩阵挺火,笔者简单试了试,实现以下算法。 如上图,需要遍历这种特殊的二维数组。我们可以看出遍历的顺序...

  • 模拟法螺旋遍历矩阵:54.螺旋矩阵(Kotlin)

    54. 螺旋矩阵[https://leetcode-cn.com/problems/spiral-matrix/]...

  • Python实现螺旋矩阵

    螺旋矩阵 什么是螺旋矩阵? 螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,向左变大...

  • 螺旋二维数组(矩阵)遍历

  • [Leetcode][数组][遍历] 54. 螺旋矩阵

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

  • 螺旋矩阵

    递归 非递归

  • 螺旋矩阵

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

  • 螺旋矩阵

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

网友评论

    本文标题:螺旋方向遍历矩阵

    本文链接:https://www.haomeiwen.com/subject/ajnefxtx.html