[LeetCode] 2326. Spiral Matrix IV

CNoodle發表於2024-09-15

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

螺旋矩陣 IV。

給你兩個整數:m 和 n ,表示矩陣的維數。

另給你一個整數連結串列的頭節點 head 。

請你生成一個大小為 m x n 的螺旋矩陣,矩陣包含連結串列中的所有整數。連結串列中的整數從矩陣 左上角 開始、順時針 按 螺旋 順序填充。如果還存在剩餘的空格,則用 -1 填充。

返回生成的矩陣。

思路

還是按照類似54題那樣的遍歷方式,無非是把 node.val 放入座標裡。

複雜度

時間O(mn)
空間O(mn) - output matrix

程式碼

Java實現

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public int[][] spiralMatrix(int m, int n, ListNode head) {
        int[][] res = new int[m][n];
        // initial the matrix with -1
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                res[i][j] = -1;
            }
        }

        int top = 0;
        int bottom = m - 1;
        int left = 0;
        int right = n - 1;
        ListNode cur = head;
        while (left <= right && top <= bottom) {
            // left to right
			for (int i = left; i <= right; i++) {
				if (cur != null) {
					res[top][i] = cur.val;
					cur = cur.next;
				} else {
					break;
				}
			}
			top++;

            // right to bottom
            for (int i = top; i <= bottom; i++) {
				if (cur != null) {
					res[i][right] = cur.val;
					cur = cur.next;
				} else {
					break;
				}
			}
			right--;

            // right to left
            if (top <= bottom) {
				for (int i = right; i >= left; i--) {
					if (cur != null) {
						res[bottom][i] = cur.val;
						cur = cur.next;
					} else {
						break;
					}
				}
			}
			bottom--;

            // bottom to top
            if (left <= right) {
				for (int i = bottom; i >= top; i--) {
					if (cur != null) {
						res[i][left] = cur.val;
						cur = cur.next;
					} else {
						break;
					}
				}
			}
			left++;

        }
        return res;
    }
}

相關文章