2326. Spiral Matrix IV

QUESTION:

You are given two integers m and n, which represent the dimensions of a matrix.

You are also given the head of a linked list of integers.

Generate an m x n matrix that contains the integers in the linked list presented in spiral order (clockwise), starting from the top-left of the matrix. If there are remaining empty spaces, fill them with -1.

Return the generated matrix.

Example 1:

Input: m = 3, n = 5, head = [3,0,2,6,8,1,7,9,4,2,5,5,0]
Output: [[3,0,2,6,8],[5,0,-1,-1,1],[5,2,4,9,7]]
Explanation: The diagram above shows how the values are printed in the matrix.
Note that the remaining spaces in the matrix are filled with -1.

Example 2:

Input: m = 1, n = 4, head = [0,1,2]
Output: [[0,1,2,-1]]
Explanation: The diagram above shows how the values are printed from left to right in the matrix.
The last space in the matrix is set to -1.

Constraints:

1 <= m, n <= 105
1 <= m * n <= 105
The number of nodes in the list is in the range [1, m * n].
0 <= Node.val <= 1000

EXPLANATION:

这是一道medium的题目, 主要是坐标的操作, 坐标需要不停地移动, 那么我们就可以先确定出, 移动的次数一定小于等于head的链表长度, 从限制中得到的. 那么问题就变成了, 怎么去操作坐标, 顺时针就是每次转弯的时候对xy就行操作, 那么我们只要把每次xy操作的值记录下来, 同时用direction去表示当前的方向. 那么什么时候转向呢, 1个就是到了边界, 另外就是已经进行了赋值, 从题目中可以得到, head的值永远都是大于0的. 那么我们就可以用-1来判断是否进行了赋值.

SOLUTION:

class Solution {
    func spiralMatrix(_ m: Int, _ n: Int, _ head: ListNode?) -> [[Int]] {
        var result: [[Int]] = Array(repeating: Array(repeating: -1, count: n), count: m)
        let xChange:[Int] = [0,1,0,-1] // 坐标x的操作
        let yChange:[Int] = [1,0,-1,0] // 坐标y的操作
        var direction:Int = 0
        var pos:[Int] = [0,0]
        var head = head
        while head != nil {
            result[pos[0]][pos[1]] = head!.val
            head = head?.next
            var posX:Int = pos[0] + xChange[direction % 4]
            var posY:Int = pos[1] + yChange[direction % 4]
            if posX < 0 || posX >= m || posY < 0 || posY >= n || result[posX][posY] != -1 {
                // 超出了范围或者已经赋值
                direction += 1
                posX = pos[0] + xChange[direction % 4]
                posY = pos[1] + yChange[direction % 4]
            }
            pos = [posX, posY]
        }
        return result
    }
}