记录力扣刷题第五题:
本文包含C++题解和Java、Python题解
题目描述如下
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
如图:
来源:LeetCode
思路:
这题思路倒是挺好想的,就是像图片中描述的一样,绕圈循环。但是代码实现有一点点难度,要注意每次变量i,j循环的区间是左闭右开区间,这样才能正确的拐弯。代码实现如下:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector< vector<int> > ans(n, vector<int>(n, 0));
int offset = 1; //设置偏移量
int loops = n/2; //设置绕圈数
int startx = 0, starty = 0;
//设置每次绕圈的起始位置(x, y)
int cnt = 1; //矩阵中元素的值
while(loops--) {
int i = startx, j = starty;
//设置变量i,j的起始位置
for(j = starty; j < starty + n - offset; ++j) {
ans[i][j] = cnt++;
}
//注意这个循环中没有赋值到此行最后一个没被赋值的元素,即左闭右开区间
for(; i < startx + n - offset; ++i) {
ans[i][j] = cnt++;
}
//依旧是左闭右开区间,但是把上一个没闭上的点赋值了,这样才能保证不重不漏
for(; j > starty; --j) {
ans[i][j] = cnt++;
}
//这里开始向左折,同样是左闭右开区间,且右界为起始值
for(; i > startx; --i) {
ans[i][j] = cnt++;
}
//这里开始向上折,左闭右开
//转完了一个圈
startx++;
starty++;
offset += 2;//由于起始和结尾都要扣去一格,所以减二
}
//如果n是奇数,那么其中心元素不算一圈,不会被循环到,这里要额外进行赋值
if(n % 2 == 1) {
ans[n / 2][n / 2] = cnt;
}
return ans;
}
};
自己动手写一下吧!是不是还挺容易晕的?其实只要注意别把左闭右开区间搞错了就能写对了。
下面放上用Java和Python的做法
Java
class Solution {
public int[][] generateMatrix(int n) {
int[][] ans = new int[n][n];
int offset = 1, cnt = 1;
int startx = 0, starty = 0;
int loops = n / 2;
for(; loops > 0; loops--) {
int i = startx, j = starty;
for(j = starty; j < starty + n - offset; ++j) {
ans[i][j] = cnt++;
}
for(i = startx; i < startx + n - offset; ++i) {
ans[i][j] = cnt++;
}
for(; j > starty; --j) {
ans[i][j] = cnt++;
}
for(; i > startx; --i) {
ans[i][j] = cnt++;
}
startx++; starty++;
offset += 2;
}
if(n % 2 == 1) {
ans[n / 2][n / 2] = cnt;
}
return ans;
}
}
Python
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
ans = [[0 for a in range(0, n)] for b in range(0, n)]
startx = 0
starty = 0
loops = n // 2
offset = 1
cnt = 1
while loops > 0 :
i = startx
j = starty
for j in range(starty, starty + n - offset):
ans[i][j] = cnt
cnt += 1
j += 1
for i in range(startx, startx + n - offset):
ans[i][j] = cnt
cnt += 1
i += 1
c = j
for j in range(c, starty, -1):
ans[i][j] = cnt
cnt += 1
j -= 1
d = i
for i in range(d, startx, -1):
ans[i][j] = cnt
cnt += 1
startx += 1
starty += 1
offset += 2
loops -= 1
if n % 2 == 1:
ans[n // 2][n // 2] = cnt
return ans