给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
思路一:设置方向,每行每列按对应方向输入,最后返回
cpp
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes) {
int maxNum = n * n;
int curNum = 1;
int** matrix = malloc(sizeof(int*) * n);
*returnSize = n;
*returnColumnSizes = malloc(sizeof(int) * n);
for (int i = 0; i < n; i++) {
matrix[i] = malloc(sizeof(int) * n);
memset(matrix[i], 0, sizeof(int) * n);
(*returnColumnSizes)[i] = n;
}
int row = 0, column = 0;
int directions[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int directionIndex = 0;
while (curNum <= maxNum) {
matrix[row][column] = curNum;
curNum++;
int nextRow = row + directions[directionIndex][0], nextColumn = column + directions[directionIndex][1];
if (nextRow < 0 || nextRow >= n || nextColumn < 0 || nextColumn >= n || matrix[nextRow][nextColumn] != 0) {
directionIndex = (directionIndex + 1) % 4;
}
row += directions[directionIndex][0];
column += directions[directionIndex][1];
}
return matrix;
}
时间复杂度O(n),空间复杂度O(n^2)
分析:
本题要按顺时针顺序排列数组后输出,可设置对应的方向数组,将递增的数通过方向数组放置到正确的位置,最后输出数组即可
总结:
本题考察对数组的应用,想到用方向确定数位置即可解决本题