题目:
给你一个正整数 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。
初始数组的第一维度从left边界开始,逐步遍历到right边界。然后第二维度从top开始,遍历到bottom边界。再反向递减遍历,直到数值大于n * n。
解题过程:
定义四个边界。
int top = 0, left = 0, buttom = n - 1, right = n - 1;
定义初始值以及二维数组。
int value = 1;
vector<vector<int>> nums(n, vector<int>(n));
定义外部循环条件,value小于n*n。
while(value < n * n){
}
从左到右遍历,填充好数组最上边。结束后上边界向下移动。
for(int i = left; i <= right; i++){
nums[top][i] = value;
value++;
}
top++;
从上到下遍历,填充好数组最右边。结束后右边界向左移动。
for(int i = top; i <= bottom; i++){
nums[i][right] = value;
value++;
}
right--;
从右向左遍历,填充好数组最下边。结束后下边界向上移动。
for(int i = right; i >= left; i--){
nums[bottom][i] = value;
value++;
}
bottom--;
从下向上遍历,填充好数组最左边。结束后左边界向右移动。
for(int i = bottom; i >= top; i--){
nums[i][left] = value;
value++;
}
left++;
将四个遍历过程放入大循环体中。
while(value <= n * n){
for(int i = left; i <= right; i++){
nums[top][i] = value;
value++;
}
top++;
for(int i = top; i <= buttom; i++){
nums[i][right] = value;
value++;
}
right--;
for(int i = right; i >= left; i--){
nums[buttom][i] = value;
value++;
}
buttom--;
for(int i = buttom; i >= top; i--){
nums[i][left] = value;
value++;
}
left++;
}
最后返回数组nums。
return nums;
题解:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int top = 0, left = 0, buttom = n - 1, right = n - 1;
int value = 1;
vector<vector<int>> nums(n, vector<int>(n));
while(value <= n * n){
for(int i = left; i <= right; i++){
nums[top][i] = value;
value++;
}
top++;
for(int i = top; i <= buttom; i++){
nums[i][right] = value;
value++;
}
right--;
for(int i = right; i >= left; i--){
nums[buttom][i] = value;
value++;
}
buttom--;
for(int i = buttom; i >= top; i--){
nums[i][left] = value;
value++;
}
left++;
}
return nums;
}
};