C语言算法-解答螺旋矩阵 II问题的C语言实现
题目:
给定一个正整数n
,生成一个包含1
到n^2
所有元素,且元素按顺时针螺旋顺序排列的n x n
正方形矩阵。
引言:
螺旋矩阵 II问题要求生成一个按顺时针螺旋顺序排列的正方形矩阵。本文将使用C语言来解答这个算法问题,并给出C代码实现。我们会详细介绍算法思路,并进行代码实现、算法分析、示例和测试、总结。
算法思路:
为了解决螺旋矩阵 II问题,我们可以模拟填充矩阵的过程。
具体算法步骤如下:
- 创建一个
n x n
的二维数组matrix
,用于存储生成的螺旋矩阵。 - 初始化四个变量,
top
、bottom
、left
、right
,分别表示当前螺旋过程的上边界、下边界、左边界、右边界。 - 初始化一个变量
num
,表示要填充的下一个数字,从1
开始。 - 在每一次螺旋遍历中,首先从左到右遍历上边界,然后从上到下遍历右边界,再从右到左遍历下边界,最后从下到上遍历左边界。
- 每遍历一行或一列后,需要更新相应的边界,以及判断是否还需要继续螺旋遍历。
- 将
num
填充到矩阵的对应位置。 - 当所有位置都被填充过后,返回生成的螺旋矩阵。
代码实现:
#include <stdio.h>
#include <stdlib.h>
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes) {
int** matrix = (int**)malloc(n * sizeof(int*));
for (int i = 0; i < n; i++) {
matrix[i] = (int*)malloc(n * sizeof(int));
}
int top = 0, bottom = n - 1, left = 0, right = n - 1;
int num = 1;
*returnSize = n;
*returnColumnSizes = (int*)malloc(n * sizeof(int));
while (top <= bottom && left <= right) {
for (int i = left; i <= right; i++) {
matrix[top][i] = num++;
}
top++;
for (int i = top; i <= bottom; i++) {
matrix[i][right] = num++;
}
right--;
if (top <= bottom) {
for (int i = right; i >= left; i--) {
matrix[bottom][i] = num++;
}
bottom--;
}
if (left <= right) {
for (int i = bottom; i >= top; i--) {
matrix[i][left] = num++;
}
left++;
}
}
return matrix;
}
算法分析:
- 时间复杂度:算法的时间复杂度为O(n^2),因为需要填充所有的矩阵元素。
- 空间复杂度:算法的空间复杂度为O(n^2),因为需要使用额外的二维数组来存储生成的螺旋矩阵。
示例和测试:
示例1:
输入: n = 3
输出:
[ [ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
示例2:
输入: n = 1
输出: [[1]]
总结:
通过模拟填充矩阵的过程,我们用C语言实现了解决螺旋矩阵 II问题的代码。这个算法在时间和空间复杂度上表现良好,适用于一般情况。希望本文能够帮助你理解解决这个算法问题的思路和方法。