首页 > 技术文章 > leetcode-59螺旋矩阵 II

chenfengyijiu 2021-03-17 22:09 原文

题目描述:

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

image-20210317220441000

解题思路:

​ 这个题目首先看的话:我的想法是分层:这个都是先外层然后内层;然后一层层的排布下去。

按照分层的思路之后,进行编码。

​ 主要碰到的问题:1、首先是按照分层,但是代码比较随意,导致多次迭代的时候,出现第一层正常,第二次修改。第二层修改又导致第一层问题。调试时间有些长

2、基于分层之后,没有立即分析第一层和第二层的位置关系

后面分析了第一层和第二层的位置关系之后,调试就比较顺畅

后面看到了解题:还有一个思路是顺时针,主要是下一个点的位置是由规律,可以顺时针 单个排布

代码:

#include <stdio.h>
/**
 * 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) {
    int maxNum = n * n;
    int curNum = 1;
    int** matrix = malloc(sizeof(int*) * n);
    *returnSize = n;
    *returnColumnSizes = malloc(sizeof(int) * n);
    for (int i = 0; i < n; i++) {
        matrix[i] = malloc(sizeof(int) * n);
        memset(matrix[i], 0, sizeof(int) * n);
        (*returnColumnSizes)[i] = n;
    }
    int row = 0, column = 0;
    int directions[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};  // 右下左上
    int directionIndex = 0;
    while (curNum <= maxNum) {
        matrix[row][column] = curNum;
        curNum++;
        int nextRow = row + directions[directionIndex][0], nextColumn = column + directions[directionIndex][1];
        if (nextRow < 0 || nextRow >= n || nextColumn < 0 || nextColumn >= n || matrix[nextRow][nextColumn] != 0) {
            directionIndex = (directionIndex + 1) % 4;  // 顺时针旋转至下一个方向
        }
        row = row + directions[directionIndex][0];
        column = column + directions[directionIndex][1];
    }
    return matrix;
}
void generateMatrix1(int num)
{
	int matr[20][20]={};
	int index=0;
	int index1=0;
	int index2=1;
	int quan_num=0;
	
	if (num%2 ==0)
		quan_num = num/2;
	else
		quan_num = (num-1)/2+1;
	printf("num :%d;quan_num:%d\r\n",num,quan_num);
	for (index=0;index<quan_num;index++)
	{
		int temp=0;
		int temp1=0;
		printf("1:%d\r\n",index);
		if (quan_num%2 !=0)
		{
			if(index == (quan_num-1))
			{
				break;
			}
		}
		
		for (index1=0;index1<(num-2*index);index1++)
		{
			matr[index][index1+index]=index2++;
			printf("[%d %d]=%d\r\n",index,index1+index,matr[index][index1+index]);
		}
		index1--;
		temp = index1+index;
		printf("2 %d\r\n",temp);
		for (index1=(0);index1<(num-2*index-1);index1++)
		{
			matr[index+index1+1][temp]=index2++;
			printf("[%d %d]=%d\r\n",index+index1+1,temp,matr[index+index1+1][temp]);
		}
		
		index1 = index1-1;
		temp = temp;
		temp1 = index+index1+1;
		printf("3 %d\r\n",temp);
		for (index1=(0);index1<(num-2*index-1);index1++)
		{
			matr[temp][temp1-index1-1]=index2++;
			printf("[%d %d]=%d\r\n",temp,temp1-index1-1,matr[temp][temp1-index1-1]);
		}
		index1 = index1-1;
		temp = temp;
		temp1 = temp1-index1-1;

		printf("4 %d\r\n",temp);
		for (index1=(0);index1<(num-2*index-1-1);index1++)
		{
			matr[temp-1-index1][temp1]=index2++;
			printf("[%d %d]=%d\r\n",temp-1-index1,temp1,matr[temp-1-index1][temp1]);
		}
	}
	if (num%4==0)
	{
		;
	}
	else if(num%4==1)
	{
		matr[(num-1)/2][(num-1)/2]=num*num;
	}
	else if(num%4==2)
	{
		matr[(num-2)/2][(num-2)/2]=num*num-3;
		matr[(num-2)/2+1][(num-2)/2]=num*num;
		matr[(num-2)/2+1][(num-2)/2+1]=num*num-1;
		matr[(num-2)/2][(num-2)/2+1]=num*num-2;
	}
	else if(num%4==3)
	{
		;
	}
	printf("\r\n");
	for (index=0;index<=19;index++)
	{
		for (index1=0;index1<=19;index1++)
		{
			printf("%3d ",matr[index][index1]);
		}
		printf("\r\n");
	}
}
int main(void)
{
	int M, T, P;
	int num=0;
	int index=0;
	int index_tmp=0;
	int num_str[1000000]={};
	
	scanf("%d", &num);
	generateMatrix1(num);
	return 0;
}

推荐阅读