2326-螺旋矩阵 IV

Raphael Liu Lv10

给你两个整数:mn ,表示矩阵的维数。

另给你一个整数链表的头节点 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 <= 105
  • 1 <= m * n <= 105
  • 链表中节点数目在范围 [1, m * n]
  • 0 <= Node.val <= 1000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
class Solution {
public:
vector<vector<int>> spiralMatrix(int m, int n, ListNode* head) {
vector<vector<int>> res(m, vector<int>(n, -1));
if (!head) return res;
ListNode* p = head;

int left = 0;
int right = n - 1;
int up = 0;
int down = m - 1;
while (left <= right && up <= down) {
// 从左到右
for (int j = left; j <= right; ++j) {
if (!p) break;
int val = p->val;
p = p->next;
res[up][j] = val;
}

// 从上到下
for (int i = up + 1; i <= down; ++i) {
if (!p) break;
int val = p->val;
p = p->next;
res[i][right] = val;
}

// 从右到左
for (int j = right - 1; j >= left; --j) {
if (!p) break;
int val = p->val;
p = p->next;
res[down][j] = val;
}

// 从下到上
for (int i = down - 1; i > up; --i) {
if (!p) break;
int val = p->val;
p = p->next;
res[i][left] = val;
}

up++;
down--;
right--;
left++;
}
return res;
}
};
 Comments
On this page
2326-螺旋矩阵 IV