[LeetCode] 2326. 螺旋矩阵 IV

给定两个整数:mn,表示矩阵的维数。另给一个整数链表的头节点head 。

请你生成一个大小为 m * 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

思路:

和那道用自然数序列螺旋填充n阶方阵的题目一样, 先用-1初始化 m * n的矩阵,再逐步收缩各边填入链表里的数字就行。只是要注意填充矩阵时要先判断链表是否空引用,因为题目没有保证链表中节点数目和矩阵元素数量相符。

AC代码:

/**
 * 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) {
        // m 行 n 列的全 -1 矩阵
        vector<vector<int>> matrix(m, vector<int>(n, -1));
        ListNode* curr= head;
        int target = n * m;
        int num = 1;
        int top = 0, bottom = m - 1;
        int left = 0, right = n - 1;
        
        while (num <= target) {
            // 上边从左到右
            for (int j = left; j <= right && num <= target; j++) {
                if(curr)
                {
                    matrix[top][j] = curr->val;
                    curr = curr->next;
                }
                num = num+1;
            }
            top++;
            
            // 右边从上到下
            for (int i = top; i <= bottom && num <= target; i++) {
                if(curr)
                {
                    matrix[i][right] = curr->val;
                    curr = curr->next;
                }
                num = num+1;
            }
            right--;
            
            // 底边从右到左
            for (int j = right; j >= left && num <= target; j--) {
                if(curr)
                {
                    matrix[bottom][j] = curr->val;
                    curr = curr->next;
                }
                num = num+1;
            }
            bottom--;
            
            // 左边从下到上
            for (int i = bottom; i >= top && num <= target; i--) {
                if(curr)
                {
                    matrix[i][left] = curr->val;
                    curr = curr->next;
                }
                num = num+1;
            }
            left++;
        }
        
        return matrix;
    }
};Code language: C++ (cpp)