玩命加载中 . . .

螺旋矩阵Ⅱ59


描述

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

示例 1:

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

输入:n = 1
输出:[[1]]

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/spiral-matrix-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n, vector<int>(n, 0));
        int startx=0, starty=0; //定义每循环一个圈的起始位置
        int loop = n/2; //每个圈循环几次,如果n为奇数3,那么loop=1,只循环一圈
        int mid = n/2; //矩阵中间的位置
        int count = 1; //用来给矩阵中每一个空格赋值
        int offset = 1; //每一圈循环都需要控制每一条边遍历的长度
        int i, j;
        while(loop--){
            i = startx;
            j = starty;
            // 模拟填充上行从左到右(左闭右开)
            for(j=starty; j<starty+n-offset; j++)
                res[i][j] = count++;
            // 模拟填充右列从上到下(左闭右开)
            for(i=startx; i<startx+n-offset; i++)
                res[i][j] = count++;
            // 模拟填充下行从右到左(左闭右开)
            for(; j>starty; j--)
                res[i][j] = count++;
            // 模拟填充左列从下到上(左闭右开)
            for(; i>starty; i--)
                res[i][j] = count++;

            // 第二圈开始的时候,起始位置要各自加一
            startx++;
            starty++;
            // offset用于控制每一圈中每一条边遍历的长度
            offset += 2;
        }
        // 如果为奇数,需要单独给矩阵中最中间的位置赋值
        if(n % 2){
            res[mid][mid] = count;
        }
        return res;
    }
};

文章作者: Jack Tim
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jack Tim !
评论
  目录