59.螺旋矩阵II
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
思路:
这道题目不涉及什么算法,纯纯模拟过程。主要要掌握各种边界问题。
模拟顺时针画矩阵的过程:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
由外向内一圈一圈这么画下去。
暴力解法:
这个是我没有想到的,居然真的有人纯暴力解出来了。因为题目说了n的范围。
提示:
1 <= n <= 20
代码实现:
/**
* 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;
*returnColumnSizes = (int*)malloc(sizeof(int)*n);
//初始化返回结果数组
int **ans=(int **)malloc(sizeof(int*)*n);
for(int i=0; i<n; i++){
ans[i] = (int*)malloc(sizeof(int)*n);
(*returnColumnSizes)[i] = n;
}
//确定每次循环的初始位置
int startX=0,startY=0;
//数组下标,i表示纵j表示横
int i=0,j=0;
//count计数,从1到n^2
int count=1;
//m代表转几圈(循环几圈)如果为奇数,则最后会剩余一个元素
for(int m=1; m<=n/2; m++){
for(i=startX,j=startY; j<n-m; j++){
ans[i][j]=count++;
}
for(; i<n-m; i++){
ans[i][j]=count++;
}
for(; j>startX; j--){
ans[i][j]=count++;
}
for(; i>startY; i--){
ans[i][j]=count++;
}
startX++;
startY++;
}
if(n%2==1)
ans[startX][startY]=count;
return ans;
}
这一期专栏记录将我每天的刷题,希望各位的监督,也希望和各位共勉。
追光的人,终会光芒万丈!!