目录
1.题目描述
难度:中等
给你两个整数:m 和 n ,表示矩阵的维数。
另给你一个整数链表的头节点 head
。
请你生成一个大小为 m x n
的螺旋矩阵,矩阵包含链表中的所有整数。链表中的整数从矩阵 左上角 开始、顺时针 按 螺旋 顺序填充。如果还存在剩余的空格,则用 -1
填充。
返回生成的矩阵。
示例
- 示例1
输入:m = 3, n = 5, head = [3,0,2,6,8,1,7,9,4,2,5,5,0]
输出:[[3,0,2,6,8],[5,0,-1,-1,1],[5,2,4,9,7]]
解释:上图展示了链表中的整数在矩阵中是如何排布的。
注意,矩阵中剩下的空格用 -1 填充。
- 示例2
输入:m = 1, n = 4, head = [0,1,2]
输出:[[0,1,2,-1]]
解释:上图展示了链表中的整数在矩阵中是如何从左到右排布的。
注意,矩阵中剩下的空格用 -1 填充。
提示
·1 <= m, n <= 10^5
·1 <= m * n <= 10^5
·链表中节点数目在范围 [1, m * n] 内
·0 <= Node.val <= 1000
2.题目解答
方法一:优化版
public class Solution {
public int[][] spiralMatrix(int m, int n, ListNode head) {
int[][] result = new int[m][n];
for (int[] r : result) {
Arrays.fill(r, -1);
}
int row = 0;
int col = 0;
int direction = 0;
int[][] moveToWhere = new int[][]{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
ListNode p = head;
while (p != null) {
result[row][col] = p.val;
p = p.next;
// 判断是否需要转向
int rowX = row + moveToWhere[direction][0];
int colY = col + moveToWhere[direction][1];
if (rowX < 0 || colY < 0 || rowX >= m || colY >= n || result[rowX][colY] != -1) {
direction = (direction + 1) % 4;
rowX = row + moveToWhere[direction][0];
colY = col + moveToWhere[direction][1];
}
row = rowX;
col = colY;
}
return result;
}
}
方法二:详细版
解题思路
1.注意初始 right = n - 1
和 bottom = m - 1
,不要弄反了!
public class Solution {
public int[][] spiralMatrix(int m, int n, ListNode head) {
int[][] result = new int[m][n];
for (int[] r : result) {
Arrays.fill(r, -1);
}
int left = 0;
int right = n - 1;
int top = 0;
int bottom = m - 1;
ListNode p = head;
while (p != null) {
// 上侧从左到右
for (int i = left; i <= right && p != null; i++) {
result[top][i] = p.val;
p = p.next;
}
top++;
// 右侧从上到下
for (int i = top; i <= bottom && p != null; i++) {
result[i][right] = p.val;
p = p.next;
}
right--;
// 底侧从右到左
for (int i = right; i >= left && p != null; i--) {
result[bottom][i] = p.val;
p = p.next;
}
bottom--;
// 左侧从下到上
for (int i = bottom; i >= top && p != null; i--) {
result[i][left] = p.val;
p = p.next;
}
left++;
}
return result;
}
}