59. Spiral Matrix II
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
For example,
Given n = 3
,
You should return the following matrix:
[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
题意:
给定一个整数n,生成一个包含1到n*n所有元素的螺旋形矩阵。
1,二维数组的动态空间分配(int **array大小为m*n):
1)首先分配m个的指针单元:
int **array = (int **)malloc( sizeof(int *) * m );
2)接着分配n个字符的单元:
for ( cnt = 0; cnt < n; cnt += 1 )
{
array[cnt] = (int *)malloc( sizeof( int ) * n );
}
注意:
分配指针单元时sizeof的参数是指针。
2,二维数组动态内存的释放:
for ( cnt = 0; cnt < n; cnt += 1 )
{
free( (void *)array[cnt] );
}
free( (void *)array );
3,变量含义:
定义brow代表从左到右执行的次数,erow代表从右到左执行的次数;bcol代表从下往上读取次数,ecol代表从上往下读取次数。所以有:
1)从左往右读取时,必须从bcol列开始读取,递增直到ecol列。
2)从右往左读取时,必须从ecol列开始读取,递减直到bcol列。
2)从上往下读取时,必须从brow行开始读取,递增直到erow行。
4)从下往上读取时,必须从erow行开始读取,递减直到brow行。
其他规则同《[LeetCode]54. Spiral Matrix》
/**
* Return an array of arrays.
* Note: The returned array must be malloced, assume caller calls free().
*/
int** generateMatrix(int n)
{
if ( n <= 0 )
{
return NULL;
}
int **array = (int **)malloc( sizeof( int *) * n );
if ( !array )
{
return NULL;
}
int cnt = 0;
for ( cnt = 0; cnt < n; cnt += 1 )
{
array[cnt] = (int *)malloc( sizeof( int ) * n );
}
int brow = 0;
int erow = n - 1;
int bcol = 0;
int ecol = n - 1;
int times = 1;
int value = 1;
cnt = 0;
while ( cnt < n * n )
{
if ( times % 4 == 1 )
{
int count = bcol;
while ( count <= ecol )
{
array[brow][count] = value;
count += 1;
value += 1;
}
cnt = cnt + count - bcol;
brow += 1;
}
else if ( times % 4 == 2 )
{
int count = brow;
while ( count <= erow )
{
array[count][ecol] = value;
count += 1;
value += 1;
}
cnt = cnt + count - brow;
ecol -= 1;
}
else if ( times % 4 == 3 )
{
int count = ecol;
while ( count >= bcol )
{
array[erow][count] = value;
count -= 1;
value += 1;
}
cnt = cnt + ecol - count;
erow -= 1;
}
else
{
int count = erow;
while ( count >= brow )
{
array[count][bcol] = value;
count -= 1;
value += 1;
}
cnt = cnt + erow - count;
bcol += 1;
}
times += 1;
}
return array;
}
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。