【LeetCode 59】螺旋矩阵II总结

文章目录

一、题意:

【LeetCode 05】螺旋矩阵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:画圈遵循循环不变量------“左闭右开”

  • 从左到右填上行
  • 从上到下填右行
  • 从右到左填下行
  • 从下到上填左行
  • 【LeetCode 05】螺旋矩阵II总结_一维数组_02

  • 左闭右开:
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;
}