6111. 螺旋矩阵 IV
给你两个整数: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 <= 105
1 <= m * n <= 105
链表中节点数目在范围 [1, m * n] 内
0 <= Node.val <= 1000
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/spiral-matrix-iv
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
模拟实现第一版
思路:
使用2个坐标,用来指明左上角和右下角的坐标,绕着以这两个坐标组成的矩形的外围遍历,然后将head的值放入遍历的坐标中,同时head指向下一节点。
注意:
如果左右坐标在同一行,那么会导致出现同一行的部分元素被多次赋值的情况,因此在赋值前需要判断他们的纵坐标。见代码的第34行,第33行有注释~
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
void fill_matrix(vector<vector<int>> &v, ListNode *head)
{
int left_x = 0;
int left_y = 0;
int right_x = v[0].size() - 1;
int right_y = v.size() - 1;
while (left_x <= right_x && left_y <= right_y && head != nullptr)
{
for (int i = left_x; i <= right_x && head != nullptr; ++i)
{
v[left_y][i] = head->val;
head = head->next;
}
for (int i = left_y + 1; i <= right_y && head != nullptr; ++i)
{
v[i][right_x] = head->val;
head = head->next;
}
// 如果左右坐标在同一行,那么会导致出现同一行的部分元素被多次赋值的情况,因此在赋值前需要判断他们的纵坐标
if (left_y != right_y)
{
for (int i = right_x - 1; i >= left_x && head != nullptr; --i)
{
v[right_y][i] = head->val;
head = head->next;
}
}
for (int i = right_y - 1; i > left_y && head != nullptr; --i)
{
v[i][left_x] = head->val;
head = head->next;
}
left_x++;
left_y++;
right_x--;
right_y--;
}
}
vector<vector<int>> spiralMatrix(int m, int n, ListNode *head)
{
vector<vector<int>> v(m, std::vector<int>(n, -1));
fill_matrix(v, head);
return v;
}
};
模拟实现——简介版
在模拟实现第一版提交后,看到其他人提交的解法,大多数是使用的一个长度为4的数组来表示四个方向,然后在每次越界的时候将修改方向。
作者:0-0fan
链接:https://leetcode.cn/problems/spiral-matrix-iv/solution/c-by-0-0fan-tjwf/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
代码如下:
class Solution {
public:
vector<vector<int>> spiralMatrix(int m, int n, ListNode* head) {
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
vector<vector<int>> res(m, vector<int>(n, -1));
auto p = head;
for(int i = 0, x = 0, y = 0, d = 0; i < m*n; i++) {
if(!p) break;
res[x][y] = p->val;
p = p->next;
int a = x + dx[d], b = y + dy[d];
if(a < 0 || a >= m || b < 0 || b >= n || res[a][b] != -1) {
d = (d+1)%4;
a = x + dx[d], b = y + dy[d];
}
x = a, y = b;
}
return res;
}
};