0
点赞
收藏
分享

微信扫一扫

[leetcode周赛]第300场——6111. 螺旋矩阵 IV-中等

​​6111. 螺旋矩阵 IV​​

给你两个整数:m 和 n ,表示矩阵的维数。另给你一个整数链表的头节点 head 。

请你生成一个大小为 m x n 的螺旋矩阵,矩阵包含链表中的所有整数。链表中的整数从矩阵 左上角 开始、顺时针 按 螺旋 顺序填充。如果还存在剩余的空格,则用 -1 填充。

返回生成的矩阵。


示例 1:

[leetcode周赛]第300场——6111. 螺旋矩阵 IV-中等_螺旋遍历矩阵

输入: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:

[leetcode周赛]第300场——6111. 螺旋矩阵 IV-中等_螺旋遍历矩阵_02

输入: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;
}
};
举报

相关推荐

0 条评论