leetcode 54. Spiral Matrix

这里写图片描述

 这题要求很简单,就是将给定的矩阵按螺旋形返回,我在大一的时候做过这道题,如今在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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值