Day2-【代码随想录训练营20期】打卡
59. 螺旋矩阵 II
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
思路:
1. 该题目主要就是边界问题,有两个常见思路,一个是归纳,二是模拟,用模拟做的题目范围会更大。
2. 注意将边界统一,即每一层螺旋四个边的长度是一致的。
3. 将边界条件用代码表示出来,由于每一层都有四个边,可以用while循环包起来。
4. 注意特殊情况,当n=1时,当n为奇数或偶数时。
思路1:归纳
class Solution {
public int[][] generateMatrix(int n) {
int layerNumber = 0;//螺旋层数
int[][] matrix = new int[n][n];//矩阵
int temp = 0;//储存每块最后输出的数字
boolean loop = true;//是否还有层数的条件
int x1,y1,x2,y2,x3,y3,x4,y4,number;
if(n == 1){
matrix[0][0] = 1;
return matrix;
}
while(loop){
x1 = layerNumber;
y1 = layerNumber;
x2 = layerNumber;
y2 = n - 1 - layerNumber;
x3 = n - 1 - layerNumber;
y3 = n - 1 - layerNumber;
x4 = n - 1 - layerNumber;
y4 = layerNumber;
number = n - (2 * layerNumber) - 1;//每层每块数字数量
for(int i = 0; i < number; i++){
matrix[x1][y1] = temp + i + 1;
matrix[x2][y2] = matrix[x1][y1] + number;
matrix[x3][y3] = matrix[x2][y2] + number;
matrix[x4][y4] = matrix[x3][y3] + number;
++y1;
++x2;
--y3;
--x4;
}
temp = matrix[x4+1][y4];
++layerNumber;
if(layerNumber > n/2 - 1){
if(n%2 == 1){
matrix[n/2][n/2] = n*n;
}
loop = false;
}
}
return matrix;
}
}
时间复杂度:O(n*n)
空间复杂度:O(n*n)
思路2:模拟
class Solution {
public int[][] generateMatrix(int n) {
int loop = 0; // 控制循环次数
int[][] res = new int[n][n];
int start = 0; // 每次循环的开始点(start, start)
int count = 1; // 定义填充数字
int i, j;
while (loop++ < n / 2) { // 判断边界后,loop从1开始
// 模拟上侧从左到右
for (j = start; j < n - loop; j++) {
res[start][j] = count++;
}
// 模拟右侧从上到下
for (i = start; i < n - loop; i++) {
res[i][j] = count++;
}
// 模拟下侧从右到左
for (; j >= loop; j--) {
res[i][j] = count++;
}
// 模拟左侧从下到上
for (; i >= loop; i--) {
res[i][j] = count++;
}
start++;
}
if (n % 2 == 1) {
res[start][start] = count;
}
return res;
}
}
时间复杂度:O(n*n)
空间复杂度:O(n*n)