6.2.54. 螺旋矩阵

思路:

直接模拟。注意循环时左闭右开为下一个留一个开头。

还有四个边界同时往内缩一圈。奇偶的问题写在下面。

储备:

54. 螺旋矩阵 - 力扣(LeetCode) 这个题解写的比较好

54. 螺旋矩阵 - 力扣(LeetCode) 这两个题解差不多的。但要追求左闭右开和while循环条件直观,所以看第一个好。

问题重点:

1、一开始初始化,矩阵的直接左闭右闭。在遍历时额外为下一步留一个开头才左闭右开。

2、四个边界同时网内缩,偶数则会相邻后错开,奇数则会隔一个后相等。

只要上下和左右 其中一对错开或者相等了,另一对一定只剩一行就能完成。因为从二维降到一维了。

无论上下奇数还是左右奇数,无论一个还是两个,都只需要补充一次。且这一次补充是左闭右闭的。因为不需要为下一步留开头了;

最后:

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> ans;
        if (matrix.size()==0) return ans;//为空
        //赋值上下左右边界
        int u=0;
        int d=matrix.size()-1;
        int l=0;
        int r=matrix[0].size()-1;//要到头。循环里会额外留一个。
        while (l<r && u<d) {
            //循环左闭右开。每行留一个作为下一步的起点。
            for (int j=l;j<r;j++) ans.push_back(matrix[u][j]);//上行
            for (int i=u;i<d;i++) ans.push_back(matrix[i][r]);//右列
            for (int j=r;j>l;j--) ans.push_back(matrix[d][j]);//下行
            for (int i=d;i>u;i--) ans.push_back(matrix[i][l]);//左列
            //成对相加减。四个边界同时往内缩。留下相等的情况单独讨论。
            //偶数。则会在相邻后错开。奇数,则会在相邻后相等。只要其中一对相等就会退出循环。
            //若同时奇数。则只需要补充一次
            u++;
            l++;
            d--;
            r--;
        }
        //相等时,不用为下一个留个开头了。所以左闭右闭。
        if (l==r) for (int i=u;i<=d;i++) ans.push_back(matrix[i][l]);
        //若同时奇数,则只需要补充一次。所以用else
        else if (u==d) for (int j=l;j<=r;j++) ans.push_back(matrix[u][j]);
        return ans;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值