leetcode 59. 螺旋矩阵 II
Posted The August
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 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
思路:
模拟顺时针画矩阵的过程:
- 从左到右填充上行
- 从上到下填充右列
- 从右到左填充下行
- 从下到上填充左列
按照左闭右开的原则,每个箭头覆盖的长度表示一条边遍历的长度,可以看出每一条拐角处的处理规则,在拐角处开始画一条新的边,这里的左闭右开就是不变量,在循环中保持不变量,才能顺利的把这个圈画出来
代码如下:
class Solution
public:
vector<vector<int>> generateMatrix(int n)
vector<vector<int>> v;
v.resize(n);
for(int i=0;i<n;i++)
v[i].resize(n);
int startx=0; //定义每循环一个圈的起始位置
int starty=0;
int loop=n/2; //每个圈循环几次
int mid=n/2; //矩阵的中间位置
int count=1; //用来给矩阵每个位置赋值
int offset=1; //每一圈循环都需要控制每一条边遍历的长度
while(loop)
int j=startx;
int i=starty;
//从左到右
for( ; j<n+startx-offset;j++)
v[i][j]=count++;
//从上到下
for( ; i<n+starty-offset;i++)
v[i][j]=count++;
//从右到左
for(;j>startx;j--)
v[i][j]=count++;
//从下到上
for(;i>starty;i--)
v[i][j]=count++;
loop--;
starty++;
startx++;
offset+=2;
//如果n为奇数,则需要单独给矩阵最中间的位置赋值
if(n%2==1)
v[mid][mid]=n*n;
return v;
;
“一进循环深似海,从此Offer是路人”
以上是关于leetcode 59. 螺旋矩阵 II的主要内容,如果未能解决你的问题,请参考以下文章