publicint[][] generateMatrix(int n) { int count = 1; if(n <= 0 ) returnnull; int [][] matrix = newint[n][n]; int r1 = 0, r2 = matrix.length - 1; int c1 = 0, c2 = matrix[0].length - 1; while (r1 <= r2 && c1 <= c2) { for (int c = c1; c <= c2; c++) { matrix[r1][c] = count; count++; } for (int r = r1 + 1; r <= r2; r++) { matrix[r][c2] = count; count++; } if (r1 < r2 && c1 < c2) { for (int c = c2 - 1; c > c1; c--) { matrix[r2][c] = count; count++; } for (int r = r2; r > r1; r--) { matrix[r][c1] = count; count++; } } r1++; r2--; c1++; c2--; } return matrix; }
模拟
绘制螺旋轨迹路径,我们发现当路径超出界限或者进入之前访问过的单元格时,会顺时针旋转方向。 假设数组有 R 行 C 列,seen[r][c] 表示第 r 行第 c 列的单元格之前已经被访问过了。当前所在位置为 (r, c),前进方向是 di。我们希望访问所有 R x C 个单元格。 当我们遍历整个矩阵,下一步候选移动位置是 (cr, cc)。如果这个候选位置在矩阵范围内并且没有被访问过,那么它将会变成下一步移动的位置;否则,我们将前进方向顺时针旋转之后再计算下一步的移动位置。
publicint[][] generateMatrix(int n) { int count = 1; if(n <= 0 ) returnnull; int [][] matrix = newint[n][n];
int [] dir_i = {0,1,0,-1}; int [] dir_j = {1,0,-1,0}; //定义行数和列数 int row = n; int cols = n; int index = 0; // 方向索引 int pos_i = 0, pos_j = -1 ; //位置索引 int len; while (count < n * n + 1){ //获得当前遍历行或列的长度 if(index == 0 || index == 2) len = cols; else len = row;
近期评论