【LeetCode 05】螺旋矩阵II总结
原创
©著作权归作者所有:来自51CTO博客作者codelinghu的原创作品,请联系作者获取转载授权,否则将追究法律责任
【LeetCode 59】螺旋矩阵II总结
文章目录
一、题意:
二、解题步骤
step1:初始化数组的大小、行数、列数、一维数组的大小
题目中参数说明:
returnColumnSizes
多见于存在二维矩阵的地方。
问:returnColumnSizes
是什么?
答:一个一维数组的地址的地址。(地址即指针,后同)
-
n
:矩阵阶数 -
*returnSize
:矩阵行数 -
**returnColumnSizes
每一行矩阵的元素个数(列数)
returnColumnSizes 是一维数组的地址的地址
* returnColumnSizes 是一维数组的地址
(* returnColumnSizes)[i]
代码:
*returnSize=n;
*returnColumnSizes=(int *)malloc(sizeof(int)*n);
int **ans=(int **)malloc(sizeof(int*)*n);//动态数组开辟内存空间
for(int i=0;<n;i++){数组空间初始化
ans[i]=(int *)malloc(sizeof(int)*n);
(*returnColumnSizes)[i]=n;//一维数组的大小
}
step2:设置转圈起始点、二维数组中间值、循环圈数、偏移数、需要添加值
NOTE:
偏移数:offset表示每一圈的每一条边的长度,用 startX+n-offset表示控制这个长度
需要添加值:每一个矩阵块的新添加值
//设置每次循环的起始位置
int startX = 0;
int startY = 0;
//设置二维数组的中间值,若n为奇数。需要最后在中间填入数字
int mid = n / 2;
//循环圈数
int loop = n / 2;
//偏移数
int offset = 1;
//当前要添加的元素
int count = 1;
step3:画圈遵循循环不变量------“左闭右开”
- 从左到右填上行
- 从上到下填右行
- 从右到左填下行
- 从下到上填左行
- 左闭右开:
int i=startx;
int j=starty;
for(j=starty;j<starty+n-offset;j++){//从左到右填上行 左闭右开
ans[startx][j]=count++;
}
for(i=startx;i<startx+n-offset;i++){//从上到下填右行 左闭右开
ans[i][j]=count++;
}
for(;j>starty;j--){//从右到左填下行 左闭右开
ans[i][j]=count++;
}
for(;i>startx;i--){//从下到上填左行 左闭右开
ans[i][j]=count++;
}
step4:临界值的改变
offset+=2;
startx++;
starty++;
loop--;
if(n%2!=0)
ans[mid][mid]=count;
return ans;
完整代码:
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){
//初始化返回的结果数组的大小
*returnSize = n;
*returnColumnSizes = (int*)malloc(sizeof(int) * n);
//初始化返回结果数组ans
int** ans = (int**)malloc(sizeof(int*) * n);
int i;
for(i = 0; i < n; i++) {
ans[i] = (int*)malloc(sizeof(int) * n);
(*returnColumnSizes)[i] = n;
}
//设置每次循环的起始位置
int startX = 0;
int startY = 0;
//设置二维数组的中间值,若n为奇数。需要最后在中间填入数字
int mid = n / 2;
//循环圈数
int loop = n / 2;
//偏移数
int offset = 1;
//当前要添加的元素
int count = 1;
while(loop) {
int i = startX;
int j = startY;
//模拟上侧从左到右
for(; j < startY + n - offset; j++) {
ans[i][j] = count++;
}
//模拟右侧从上到下
for(; i < startX + n - offset; i++) {
ans[i][j] = count++;
}
//模拟下侧从右到左
for(; j > startY; j--) {
ans[i][j] = count++;
}
//模拟左侧从下到上
for(; i > startX; i--) {
ans[i][j] = count++;
}
//偏移值每次加2
offset+=2;
//遍历起始位置每次+1
startX++;
startY++;
loop--;
}
//若n为奇数需要单独给矩阵中间赋值
if(n%2)
ans[mid][mid] = count;
return ans;
}