【LeetCode从零单刷】Spiral Matrix II

题目:

Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.

For example,
Given n = 3,

You should return the following matrix:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]

解答:

重要的是找到循环的规律:每层环都可以由四个部分组成,第一个环每部分长为(n-1),第二个环每部分长为(n-3)…(n-2k)… 如下图所示:


对于奇数与偶数不同的地方在于:奇数螺旋矩阵的最中间仅有一个部分组成,取值为 n;偶数螺旋矩阵的最中间仍然是四个部分。

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<int> row(n, 0);
        vector<vector<int>> ans(n, row);
        if(n <= 0)  return ans;
        
        int x = 0, y = 0;
        int num = 0;
        int a, b, c, d;
        for(int i=n-1; i>=0; i=i-2)
        {
            if(i == 0)  ans[x][y] = n*n;
            else
            {
                for(a = 0; a < i; a++)
                {
                    ans[x][y+a] = ++num;
                }
                y = y + i;
                
                for(b = 0; b < i; b++)
                {
                    ans[x+b][y] = ++num;
                }
                x = x + i;
                
                for(c = 0; c < i; c++)
                {
                    ans[x][y-c] = ++num;
                }
                y = y - i;
                
                for(d = 0; d < i; d++)
                {
                    ans[x-d][y] = ++num;
                }
                x = x - i + 1;
                y = y + 1;
            }
        }
        return ans;
    }
};


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值