【数组】螺旋矩阵
https://leetcode.cn/problems/spiral-matrix-ii/description/
方法:模拟
通过这四个方向的遍历,,一层一层往里,于是有了四个方向(左闭右开)
我引入一个维度的概念,也就是最外面维度是0,往里面一层维度就+1。
特殊情况:n是奇数,最中间那个元素无法赋值到,添加一个if就能解决
值得注意:数组的边界问题,防止越界
class Solution {
public int[][] generateMatrix(int n) {
int[][] matrix = new int[n][n];
int b = n - 1; // 边长-1
int y = 1; // 赋值数字
int r = 0; // 所处维度
while(b > 0) {
for(int i = r; i < b+r; i++) {
matrix[r][i] = y++;
}
for(int i = r; i < b+r; i++) {
matrix[i][n-r-1] = y++;
}
for(int i = n-r-1; i >= n - b - r; i--) {
matrix[n-r-1][i] = y++;
}
for(int i = n-r-1; i >= n - b - r; i--) {
matrix[i][r] = y++;
}
r++;
b-=2;
}
if ( n % 2 != 0) {
int mid = n / 2;
matrix[mid][mid] = y;
}
return matrix;
}
}
优化后:
class Solution {
public int[][] generateMatrix(int n) {
int[][] matrix = new int[n][n];
int startX = 0; // x轴起始
int startY = 0; // y轴起始
int count = 1; // 计数
int offset = 1;
int times = n / 2; // 进行 n / 2 次循环
while(times-- > 0) {
int j = startY;
int i = startX;
for(; j < n - offset; j++) {
matrix[startX][j] = count++;
}
for(; i < n - offset; i++) {
matrix[i][j] = count++;
}
for(; j > startY; j--) {
matrix[i][j] = count++;
}
for(; i > startX; i--) {
matrix[i][startY] = count++;
}
startX++;
startY++;
offset++;
}
if(n % 2 != 0) {
int mid = n/2;
matrix[mid][mid] = count;
}
return matrix;
}
}