D5 59.螺旋矩阵
59 螺旋矩阵(力扣:https://leetcode.cn/problems/spiral-matrix-ii/
条件:给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。(1 <= n <= 20)
Tips: 最开始的构想是使用行列遍历、每次到头时反转flag使得行列交替++或--,但是++和--的边界条件不同,没法在两个式子里同时满足,所以使用四个边界(上下左右),注意边界条件,如每次都是加到该行/列最后
初版代码:
点击查看代码
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
// 二维,先更新行再更新列
// vector<vector<int>> matrix(n,vector<int>(n,0));
int matrix[20][20] = {0};
// 矩阵填充从1开始
int value = 1;
int left = 0, right = n - 1;
int top = 0, bottom = n - 1;
while (value <= n * n) {
for (int i = left; i <= right; value++, i++) {
matrix[top][i] = value;
}
top++;
for (int i = top; i <= bottom; value++, i++) {
matrix[i][right] = value;
}
right--;
for (int i = right; i >= left; value++, i--) {
matrix[bottom][i] = value;
}
bottom--;
for (int i = bottom; i >= top; value++, i--) {
matrix[i][left] = value;
}
left++;
}
return matrix[][];
}
};
以下为初版行列遍历代码(无法运行
点击查看代码
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
//二维,先更新行再更新列
vector<vector<int>> matrix(n,vector<int>(n,0));
//矩阵填充从1开始
int value = 1;
int column = 0;
int row = 0;
// 标志位决定行列++还是--,结尾元素坐标为(n-1,n-1)
for(signed char flag = 1; column != n-1 && row != n-1; flag *= -1){
//先执行--行不动列增加
for(; column < n && column > 0; column += flag, value++){
matrix[n][column] = value;
}
//再执行--列不动行增加
for(; row < n && row > 0; row += flag, value++){
matrix[row][n] = value;
}
//完成后n需要减小一位
n--;
//反转标志位,++变--
}
return matrix;
}
};
浙公网安备 33010602011771号