数组 | LeetCode 59 螺旋矩阵II

101 阅读1分钟

题目描述

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

本题思路

模拟数字一个个螺旋放入矩阵

代码如下:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(
            n, vector<int>(n, 0));  // 使用vector定义一个二维数组
        int loop = n / 2;           // 要螺旋排列的圈数
        int startx = 0, starty = 0; // 用来表示每次行或列循环的开始
        int mid = n / 2; // 用以表示n为奇数时最中间的坐标位置
        int count = 1;   // 对每个位置赋值就加一
        int offset = 1;
        int i, j;
        while (loop--) {
            i = startx;
            j = starty;
            // 模拟一圈的上行从左到右
            for (j = starty; j < n - offset; j++)
                res[startx][j] = count++;

            // 模拟一圈的右列从上到下
            for (i = startx; i < n - offset; i++)
                res[i][j] = count++;

            // 模拟一圈的下行从右到左
            for (; j > starty; j--)
                res[i][j] = count++;

            // 模拟一圈的左列从下到上
            for (; i > startx; i--)
                res[i][j] = count++;

            // 每循环一次开始就从前一次的位置坐标都加一
            startx++;
            starty++;
            // 一圈后排列的长度减一
            offset--;
        }
        if (n % 2 == 1)
            res[mid][mid] = count;
        return res;
    }
};

利用循环不变量,每一行一列左闭右开,四个for循环,定义两个变量startx,starty表示下次开始的坐标。offser表示每转完一圈就减一,用来限制每次写数的长度

上行行不变,右列列不变,下行行不变,左列列不变 下行别越起始横坐标,左列别越起始纵坐标