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 <= 1051 <= m * n <= 105[1, m * n].0 <= Node.val <= 1000/**
* 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 {
private static final int[][] clock = {
{ 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 }
};
private boolean isValid(int i, int j, int m, int n, int[][] mat) {
if (i < 0 || i >= m || j < 0 || j >= n || mat[i][j] != -1)
return false;
return true;
}
public int[][] spiralMatrix(int m, int n, ListNode head) {
int[][] mat = new int[m][n];
for (int i = 0; i < m; i++)
Arrays.fill(mat[i], -1);
int r = 0, c = 0, dir = 0, i = 0, j = 0;
while (head != null) {
// System.out.println(i + "\t" + j);
if (isValid(i, j, m, n, mat)) {
r = i;
c = j;
mat[r][c] = head.val;
head = head.next;
} else
dir = (dir + 1) % 4;
i = r + clock[dir][0];
j = c + clock[dir][1];
}
return mat;
}
}