这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战
leetcode 螺旋矩阵 II
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[[1]]
解题:根据题目意思,给一个正整数n,然后生成一个n*n的矩阵(二维数组),然后数组元素是按顺时针顺序螺旋排列的,元素值为1-(n*n)递增的。那么可以先生成一个n*n的二维数组,然后按照顺时针螺旋顺序给数组原素递增赋值,最后到元素赋值元素等于n*n时可以了。首先顺时针螺旋顺序的赋值方向为 右-> 下-> 左-> 上-> 右-> 循环的赋值,初始从矩阵的左上角[0][0]开始,一直往右赋值,直到超出矩阵边界或者这个位置的元素已经赋值了,就开始顺时针转换方向。是否超出矩阵边界就判断下一个元素的下标是否越界;要判断元素是否已经赋值了,可以直接判断下一个元素值是否等于0,因为初始化二维数组的元素都是0,而赋值的元素值都是大于0的。如何转换方向呢?首先需要一个变量可以记录当前方向的,有4种方向并且是按右下左上顺序循环的, 那么可以定义directions初始为0,代表方向为右,每次转换方向directions++,然后当前方向就是direction % 4的结果,即:0代表右方向、1代表下方向、2代表左方向、3代表上方向。同时读取下一个元素时需要根据当前方向读取,可以用row、col表示矩阵的二维下标,基于矩阵中的4个方向可以发现,当前为右方向的时候读取下一个元素是行下标+1即row+1,当方向为下的时候读取下一个元素是列下标+1即col+1,当方向为左的时候读取下一个元素是行下标-1即row-1,当方向为上的时候读取下一个元素是列下标-1即col-1。因此要获取下一个元素的下标需要判断当前方向然后给对应的row或者col的值+1或者-1, 或者使用一个二维数组[[0,1],[1,0],[0,-1],[-1,0]],那么row只需加上[direction % 4][0],col只需加上[direction % 4][1]就可以不额外的判断了。最后如果赋值的当前元素等于n*n的时候就可以结束赋值了,返回最终结果。
class Solution {
public int[][] generateMatrix(int n) {
int[][] matrix = new int[n][n];
int row = 0;
int col = 0;
int count = 0;
int direction = 0;
int[][] nextIndex = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
while (count < n * n) {
matrix[row][col] = ++count;
int nextRow = row + nextIndex[direction % 4][0];
int nextCol = col + nextIndex[direction % 4][1];
if (nextRow < 0 || nextRow >= n || nextCol < 0 || nextCol >= n || matrix[nextRow][nextCol] != 0) {
direction++;
nextRow = row + nextIndex[direction % 4][0];
nextCol = col + nextIndex[direction % 4][1];
}
row = nextRow;
col = nextCol;
}
return matrix;
}
}