leetcode 54. Spiral Matrix

来源:互联网 发布:修改apache配置文件 编辑:程序博客网 时间:2024/06/11 10:04

这里写图片描述

 这题要求很简单,就是将给定的矩阵按螺旋形返回,我在大一的时候做过这道题,如今在leetcode看到,也是种缘分吧。

 通过作图我们可以发现,对于每个行数为m,列数为n的矩阵,螺旋的圈数不会超过m和n中的较小值。通过分析遍历的顺序和对应的圈数,我们可以得到一些对应关系,这将帮助我们确定遍历的顺序(通过标志每次拐角的位置也可以达到同样的效果)。特别需要注意的是,当我们在某个方向(螺旋的方向分为右,下,左,上)不能访问任意一点的时候,说明我们已经遍历完成了。这个时候不管圈数是多少,直接退出循环即可。

  代码如下:

class Solution {public:    vector<int> spiralOrder(vector<vector<int>>& matrix) {        vector<int> result;        if (matrix.empty()) return result;        int m = matrix.size();  //  行数        int n = matrix[0].size();  //  列数        int count = 0;  //  记录已完成的圈数        int leftNum = m * n;        int min = m < n ? m : n;        while (count < min) {            //  向右            for (int i = count; i < n - count; i++) {                result.push_back(matrix[count][i]);            }            //  一旦没有点加进result,说明遍历已经完成,每螺旋一条边都要检查一次            if (count >= n - count) break;            //  向下            for (int i = count + 1; i < m - count; i++) {                result.push_back(matrix[i][n - count - 1]);            }            if (count + 1 >= m - count) break;            //  向右            for (int i = n - count - 2; i >= count; i--) {                result.push_back(matrix[m - count - 1][i]);            }            if (n - count - 2 < count) break;            //  向上            for (int i = m - count - 2; i > count; i--) {                result.push_back(matrix[i][count]);                leftNum--;            }            if (m - count - 2 <= count) break;            count++;        }        return result;    }};
原创粉丝点击