ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

LeetCode 59. 螺旋矩阵 II:边界收缩法详解

LeetCode 59. 螺旋矩阵 II:边界收缩法详解 题目描述给你一个正整数n生成一个包含1到n^2所有元素且元素按顺时针顺序螺旋排列的n x n正方形矩阵matrix。示例 1输入n 3输出[[1,2,3],[8,9,4],[7,6,5]]示例 2输入n 1输出[[1]]解题思路模拟与边界收缩这道题不涉及复杂的算法思想核心在于过程模拟。我们需要按照顺时针“画圈”的顺序依次填充数字。为了避免陷入复杂的坐标推导和死循环最优雅的解法是设定四个边界上、下、左、右每填完一行或一列就收缩对应的边界。核心步骤初始化创建 n×n 矩阵定义四个边界top 0,bottom n - 1,left 0,right n - 1。定义要填入的数字num 1。循环填充当num n * n时从左到右填充上边界top这一行从left到right。填完后上边界下移 (top)。从上到下填充右边界right这一列从top到bottom。填完后右边界左移 (right--)。从右到左填充下边界bottom这一行从right到left。填完后下边界上移 (bottom--)。从下到上填充左边界left这一列从bottom到top。填完后左边界右移 (left)。边界安全检查在最后两个步骤从右到左、从下到上执行前必须检查top bottom和left right防止当 n 为奇数时最内层发生重复填充。代码实现C 实现#include vector using namespace std; class Solution { public: vectorvectorint generateMatrix(int n) { // 初始化 n x n 的全 0 矩阵 vectorvectorint matrix(n, vectorint(n, 0)); // 定义四个边界 int top 0, bottom n - 1; int left 0, right n - 1; int num 1; // 当前要填入的数字 int target n * n; // 目标数字 while (num target) { // 1. 从左到右 (填充上边界) for (int i left; i right; i) { matrix[top][i] num; } top; // 上边界下移 // 2. 从上到下 (填充右边界) for (int i top; i bottom; i) { matrix[i][right] num; } right--; // 右边界左移 // 3. 从右到左 (填充下边界) if (top bottom) { for (int i right; i left; --i) { matrix[bottom][i] num; } bottom--; // 下边界上移 } // 4. 从下到上 (填充左边界) if (left right) { for (int i bottom; i top; --i) { matrix[i][left] num; } left; // 左边界右移 } } return matrix; } };复杂度分析时间复杂度O(n平方)。矩阵中共有 n平方 个位置每个位置仅被访问和赋值一次。空间复杂度O(1)。算法仅使用了常数个整型变量top,bottom,left,right,num等来维护边界和状态。返回的 n×n 矩阵是题目要求必须占用的空间
返回列表