专业建站提供商网络营销推广与策划
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; // 边长-1int 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;}
}