59. 螺旋矩阵 II

已解答

中等

相关标签

相关企业

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

 

示例 1:

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

示例 2:

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

 

提示:

  • 1 <= n <= 20

顺时针螺旋矩阵生成思路

核心思想

模拟顺时针螺旋填充的过程,通过动态调整边界实现从外向内逐层填充。使用四个边界指针(top, bottom, left, right)控制填充范围,按照“右→下→左→上”的顺序循环填充。

关键步骤

  1. 初始化

    • 创建 n×n 矩阵并初始化为0

    • 设置边界指针:

      • top = 0(上边界)

      • bottom = n-1(下边界)

      • left = 0(左边界)

      • right = n-1(右边界)

    • 设置起始数字 start = 1

复杂度分析

  • 时间复杂度:O(n²)
    需要精确填充 n² 个元素,每个元素操作时间复杂度 O(1)

  • 空间复杂度:O(n²)
    存储结果矩阵所需空间,无额外空间消耗

该算法通过边界指针的动态调整,高效实现了螺旋填充过程,完美处理了各种边界情况和矩阵尺寸(包括奇偶尺寸)。

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n, vector<int>(n, 0)); // 使用vector定义一个二维数组
		int top = 0, bottom = n - 1, left = 0, right = n - 1;
		int start = 1; // 从1开始填充
		while (start <= n * n) 
		{
			for (int i = left; i <= right; i++)
			{
				res[top][i] = start;
				start++;
			}
			top++;
			for (int i = top; i <= bottom; i++)
			{
				res[i][right] = start;
				start++;
			}
			right--;
			for (int i = right; i >= left; i--) {
				res[bottom][i] = start;
				start++;
			}
			bottom--;
			for (int i = bottom; i >= top; i--)
			{
				res[i][left] = start;
				start++;
			}
			left++;
		}
		return res;
    }
};

不会做游戏