题目
给你两个整数: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 填充。
解题
方法一:模拟
螺旋矩阵系列题目都差不多,无非是用链表来取值。
/** * 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: vector<vector<int>> spiralMatrix(int m, int n, ListNode* head) { vector<vector<int>> matrix(m,vector<int>(n,-1)); vector<vector<int>> dirs={{0,1},{1,0},{0,-1},{-1,0}}; int x=0,y=0; int cur_d=0; int top=0,down=m-1,left=0,right=n-1; ListNode* cur=head; while(cur){ matrix[x][y]=cur->val; if(cur_d==0&&y==right){ top++; cur_d++; } else if(cur_d==1&&x==down){ right--; cur_d++; } else if(cur_d==2&&y==left){ down--; cur_d++; } else if(cur_d==3&&x==top){ left++; cur_d++; } cur_d%=4; x+=dirs[cur_d][0]; y+=dirs[cur_d][1]; cur=cur->next; } return matrix; } };