螺旋矩阵II

螺旋矩阵II

给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:

输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]

1 2 3
8 9 4
7 6 5

这题并没有涉及什么算法,就是模拟过程,关键是清楚处理流程,这个过程是围绕边转圈来进行的。首先,需要清楚转几圈,我们知道,转一圈会使边减2,三维方阵转了一圈,最后就剩下一个元素了,所以得到结果转loop = n / 2圈,如果是奇数,那么最后将剩下的补上就行;其次,我们填充数的时候要注意遵循循环不变量的原则,这里用左闭右开,这样思路就清晰多了。

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        std::vector<vector<int>> nums(n,vector<int>(n,0));
        int startx = 0, starty = 0; // 起始点 转了一圈都会+1
        int offset = 1, num = 1; // offset-> 左闭右开 num-> 计数
        int i,j; // row col
        int loop = n / 2; // 循环次数
        while(loop--){
            i = startx, j = starty;
            for(; j < n-offset; ++j){
                nums[startx][j] = num++;
            }
            for(; i < n-offset; ++i){
                nums[i][j] = num++;
            }
            for(; j > starty; --j){
                nums[i][j] = num++;
            }
            for(; i > startx; --i){
                nums[i][starty] = num++;
            }
            ++startx;
            ++starty;
            ++offset;
        }
        if(n%2 == 1){ // 如果是奇数,需要处理中心的元素
            int mid = n / 2;
            nums[mid][mid] = n * n;
        }
        return nums;
    }
};
posted @ 2026-03-02 13:22  wenyiGamecpp  阅读(21)  评论(0)    收藏  举报