题目

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

示例 1:

img

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

示例 2:

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

提示:

  • 1 <= n <= 20

解答

  1. 定义四个变量top,bottom,left,right,分别代表矩阵的上下左右边界。
  2. 定义一个变量 count 表示当前元素的值,初始值为1。
  3. 只要 top <= bottom && left <= right ,循环执行以下步骤:
    1. 先向右填充 top 行的元素,元素的值递增,并将 top 向下移动1。
    2. 向下填充 right 列的元素,元素的值递增,并将 right 向左移动1。
    3. 如果 top <= bottom ,向左填充 bottom 行的元素,元素的值递增,并将 bottom 向上移动1。
    4. 如果 left <= right ,向上填充 left 列的元素,元素的值递增,并将 left 向右移动1。
class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> matrix(n, vector<int>(n, 0));
        int top = 0, bottom = n - 1, left = 0, right = n - 1;
        int count = 1;
        while (top <= bottom && left <= right) {
            for (int j = left; j <= right; j++) {
                matrix[top][j] = count++;
            }
            top++;
            for (int i = top; i <= bottom; i++) {
                matrix[i][right] = count++;
            }
            right--;
            if (top <= bottom) {
                for (int j = right; j >= left; j--) {
                    matrix[bottom][j] = count++;
                }
                bottom--;
            }
            if (left <= right) {
                for (int i = bottom; i >= top; i--) {
                    matrix[i][left] = count++;
                }
                left++;
            }
        }
        return matrix;
    }
};