螺旋矩阵
模拟顺时针画矩阵的过程:
填充上行从左到右
填充右列从上到下
填充下行从右到左
填充左列从下到上
本文推荐两道螺旋矩阵的题,均来自LeetCode,使用Java编写。
螺旋矩阵
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
class Solution {
public List spiralOrder(int[][] matrix) {
List list = new ArrayList();
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return list;
}
int rows = matrix.length, colums = matrix[0].length;
int top = 0, bottom = rows - 1, left = 0, right = colums - 1;
while (top <= bottom && left <= right) {
//上界
for (int i = left; i <= right; i++) {
list.add(matrix[top][i]);
}
//右界
for (int i = top + 1; i <= bottom; i++) {
list.add(matrix[i][right]);
}
if (top < bottom && left < right) {
//下界
for (int i = right - 1; i >= left + 1; i--) {
list.add(matrix[bottom][i]);
}
//左界
for (int i = bottom; i >= top + 1; i--) {
list.add(matrix[i][left]);
}
}
top++;
bottom--;
left++;
right--;
}
return list;
}
}
螺旋矩阵 II
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[[1]]
提示:
1 <= n <= 20
class Solution {
public int[][] generateMatrix(int n) {
int[][] result = new int[n][n];
int loop = n / 2;
int startX = 0, startY = 0;
int offset = 1;
//如果n为奇数则有中间元素
int mid = n / 2;
int count = 1;
while (loop > 0) {
int i = startX, j = startY;
//上侧从左到右
for (; j < startY + n - offset; j++) {
result[startX][j] = count++;
}
//右侧从上到下
for (; i < startX + n - offset; i++) {
result[i][j] = count++;
}
//下侧从右到左
for (; j > startY; j--) {
result[i][j] = count++;
}
//左侧从下到上
for (; i > startX; i--) {
result[i][j] = count++;
}
startX++;
startY++;
offset += 2;
loop--;
}
//如果n为奇数
if (n % 2 == 1) {
result[mid][mid] = count;
}
return result;
}
}



