给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出: [
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
java代码分析,也是按照螺旋矩阵I的规则,吧矩阵分层,每一层有四个循环,分别为up——right——down——left
public static int[][] generateMatrix(int n) {
int[][] matrix = new int[n][n];
if (n < 1)
return matrix;
int up = 0, down = n - 1, left = 0, right = n - 1;// 设置上下左右边界
int k = 0;
while (true) {
// up
for (int c = left; c <= right; c++) matrix[up][c] = k++;
if (++up > down) break;
// right
for (int r = up; r <= down; r++) matrix[r][right] = k++;
if (--right < left) break;
// down
for (int c = right; c >= left; c--) matrix[down][c] = k++;
if (--down < up) break;
// left
for (int r = down; r >= up; r--) matrix[r][left] = k++;
if (++left > right) break;
}
return matrix;
}
同理,螺旋矩阵I也可以采用同样的解决方式
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> spiral = new ArrayList<>();
if (matrix.length < 1) return spiral;
int m = matrix.length, n = matrix[0].length;
int u = 0, d = m - 1, l = 0, r = n - 1, k = 0;
while (true) {
// up
for (int col = l; col <= r; col++) spiral.add(k++, matrix[u][col]);
if (++u > d) break;
// right
for (int row = u; row <= d; row++) spiral.add(k++, matrix[row][r]);
if (--r < l) break;
// down
for (int col = r; col >= l; col--) spiral.add(k++, matrix[d][col]);
if (--d < u) break;
// left
for (int row = d; row >= u; row--) spiral.add(k++, matrix[row][l]);
if (++l > r) break;
}
return spiral;
}