59. 螺旋矩阵 II LeetCode

问题描述

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

示例 1:


输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:

输入:n = 1
输出:[[1]]
 

提示:

1 <= n <= 20

解题思路

这个题螺旋矩阵创建过程并不难,只需明确自己的临界条件,注意一些细节即可。

我主要是被这个函数的形参给难住了欸,我一直以为返回的二维数组是returnColumnSizes,然后一直有bug,调啊调调啊调,最后发现需要自己malloc一个二位数组arr,是我英语不够好了,看到returnColumnSizes不知道啥意思呜呜呜。

还有要注意一下二维数组动态申请内存的形式,这个我是看这个博客了解的(54条消息) malloc申请二维数组的四种方法_阳光那么暖。-CSDN博客_malloc 二维数组,大家可以去详细了解学习一下。

欧克,这次分享就到这里了。

解题代码

/**
 * 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;
	//二位数组动态申请内存应该这样!!!
	int** arr = (int**)malloc(sizeof(int*) * n);
	for (int i = 0; i < n; ++i) {
		arr[i] = (int*)malloc(sizeof(int) * n);
	}
	//这一步是给columnSizes创建空间
	*returnColumnSizes = (int*)malloc(sizeof(int) * n);
	for (int i = 0; i < n; ++i) {
		(*returnColumnSizes)[i] = n;
	}
	//初始化每个位置的值为-1,代表还没有被赋值。
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < n; ++j) {
			arr[i][j] = -1;
		}
	}
	int count = 1;
	int line = 0, column = 0;
	//我是用闭区间的方法,每一次前进都前进到无法前进为止,然后最后因为还有一个++,所以需要退出循环后--调整一下
	while(1){
		//第一步,从左向右
		while (column < n && arr[line][column] == -1) {
			arr[line][column++] = count++;
		}
		//每次前进完都判断一下是否完成,若完成即可退出循环
		if (count > n * n) {
			break;
		}
		column--;
		line++;
		//第二步,从上向下
		while (line < n && arr[line][column] == -1) {
			arr[line++][column] = count++;
		}
		if (count > n * n) {
			break;
		}
		line--;
		column--;
		//第三步,从右向左
		while (column >= 0 && arr[line][column] == -1) {
			arr[line][column--] = count++;
		}
		if (count > n * n) {
			break;
		}
		column++;
		line--;
		//第四步,从下向上
		while (line >= 0 && arr[line][column] == -1) {
			arr[line--][column] = count++;
		}
		if (count > n * n) {
			break;
		}
		line++;
		column++;
	}
	return arr;
}

猜你喜欢

转载自blog.csdn.net/linwuwu985/article/details/122511615