2020-01-18 刷题 螺旋矩阵 II
题目链接:https://leetcode-cn.com/problems/spiral-matrix-ii/
题目描述:
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
来源:力扣(LeetCode)
题目思想:是循环不变量的主要思考,思路为确定边界,是左闭右开,还是左开右闭。
然后下来就是明确,此题根据给的n进行确定循环的圈数以及每条边循环的量
题目代码:
1 class Solution { 2 public: 3 vector<vector<int>> generateMatrix(int n) { 4 vector<vector<int>> res(n, vector<int>(n, 0)); // 使用vector定义一个二维数组 5 int startx = 0, starty = 0; // 定义每循环一个圈的起始位置 6 int loop = n / 2; // 每个圈循环几次,例如n为奇数3,那么loop = 1 只是循环一圈,矩阵中间的值需要单独处理 7 int mid = n / 2; // 矩阵中间的位置,例如:n为3, 中间的位置就是(1,1),n为5,中间位置为(2, 2) 8 int count = 1; // 用来给矩阵中每一个空格赋值 9 int offset = 1; // 每一圈循环,需要控制每一条边遍历的长度 10 int i,j; 11 while (loop --) { 12 i = startx; 13 j = starty; 14 15 // 下面开始的四个for就是模拟转了一圈 16 // 模拟填充上行从左到右(左闭右开) 17 for (j = starty; j < starty + n - offset; j++) { 18 res[startx][j] = count++; 19 } 20 // 模拟填充右列从上到下(左闭右开) 21 for (i = startx; i < startx + n - offset; i++) { 22 res[i][j] = count++; 23 } 24 // 模拟填充下行从右到左(左闭右开) 25 for (; j > starty; j--) { 26 res[i][j] = count++; 27 } 28 // 模拟填充左列从下到上(左闭右开) 29 for (; i > startx; i--) { 30 res[i][j] = count++; 31 } 32 33 // 第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1) 34 startx++; 35 starty++; 36 37 // offset 控制每一圈里每一条边遍历的长度 38 offset += 2; 39 } 40 41 // 如果n为奇数的话,需要单独给矩阵最中间的位置赋值 42 if (n % 2) { 43 res[mid][mid] = count; 44 } 45 return res; 46 } 47 };