问题描述
给你一个正整数 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
解题思路
这个题螺旋矩阵创建过程并不难,只需明确自己的临界条件,注意一些细节即可。
我主要是被这个函数的形参给难住了欸,我一直以为返回的二维数组是returnColumnSizes,然后一直有bug,调啊调调啊调,最后发现需要自己malloc一个二位数组arr,是我英语不够好了,看到returnColumnSizes不知道啥意思呜呜呜。
还有要注意一下二维数组动态申请内存的形式,这个我是看这个博客了解的(54条消息) malloc申请二维数组的四种方法_阳光那么暖。-CSDN博客_malloc 二维数组,大家可以去详细了解学习一下。
欧克,这次分享就到这里了。
解题代码
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes) {
*returnSize = n;
//二位数组动态申请内存应该这样!!!
int** arr = (int**)malloc(sizeof(int*) * n);
for (int i = 0; i < n; ++i) {
arr[i] = (int*)malloc(sizeof(int) * n);
}
//这一步是给columnSizes创建空间
*returnColumnSizes = (int*)malloc(sizeof(int) * n);
for (int i = 0; i < n; ++i) {
(*returnColumnSizes)[i] = n;
}
//初始化每个位置的值为-1,代表还没有被赋值。
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
arr[i][j] = -1;
}
}
int count = 1;
int line = 0, column = 0;
//我是用闭区间的方法,每一次前进都前进到无法前进为止,然后最后因为还有一个++,所以需要退出循环后--调整一下
while(1){
//第一步,从左向右
while (column < n && arr[line][column] == -1) {
arr[line][column++] = count++;
}
//每次前进完都判断一下是否完成,若完成即可退出循环
if (count > n * n) {
break;
}
column--;
line++;
//第二步,从上向下
while (line < n && arr[line][column] == -1) {
arr[line++][column] = count++;
}
if (count > n * n) {
break;
}
line--;
column--;
//第三步,从右向左
while (column >= 0 && arr[line][column] == -1) {
arr[line][column--] = count++;
}
if (count > n * n) {
break;
}
column++;
line--;
//第四步,从下向上
while (line >= 0 && arr[line][column] == -1) {
arr[line--][column] = count++;
}
if (count > n * n) {
break;
}
line++;
column++;
}
return arr;
}