【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)… 如下图所示:

【LeetCode从零单刷】Spiral Matrix II_第1张图片

对于奇数与偶数不同的地方在于:奇数螺旋矩阵的最中间仅有一个部分组成,取值为 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;
    }
};


你可能感兴趣的:(LeetCode,C++,Matrix,Spiral)