螺旋方向遍历矩阵

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的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,349评论 0 33
  • 其实,我更喜欢将这一集叫做:忽如其来的初恋。 这一集进行的很快,事情发展的很简单,但不停歇,而且这一集里面没有主人...
    任晨玮阅读 10,746评论 2 4
  • 街角有一家星期三书店。因为每个星期三书店都不营业,大家反而都记住了这一天。但是你要是去推门,却会发现门是开着的。看...
    栖树阅读 15,982评论 11 52
  • 这部片出乎我的意料,先是觉得好不到哪去,然后很奇怪咦~这么多人看,看完后觉得果然还是好不到哪去。 我国票房排行榜《...
    曾博阅读 2,972评论 0 0
  • 一 想念无数个夜晚我看过的书写过的题和想放弃时想的你 高中每天晚上十点半下晚自习 直到铃声响起终于解脱 路上走回家...
    大学生的迷茫阅读 2,767评论 1 0