Spiral Matrix and FSM (Finite State Machine)

Solution to this problem requires an FSM. The FSM controls the direction to which either the row or the column should move. Control the outer-loop based on the current list node. Time complexity then becomes 4 * 10^5. Code is down below, cheers, ACC.


2326. Spiral Matrix IV
Medium

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

public int[][] SpiralMatrix(int m, int n, ListNode head)
{
    int[][] matrix = new int[m][];

    for (int r = 0; r < m; r++)
    {
        matrix[r] = new int[n];
        for (int c = 0; c < n; c++)
        {
            matrix[r][c] = -1;
        }
    }

    char[] direction = new char[] { 'R', 'D', 'L', 'U' };
    int directionIndex = 0;
    int currentRow = 0;
    int currentCol = 0;
    ListNode node = head;

    while(node != null)
    {
        matrix[currentRow][currentCol] = node.val;
        node = node.next;

        int moveAttempts = 0;
        while (moveAttempts < direction.Length)
        {
            bool validMove = false;
            switch (direction[directionIndex])
            {
                case 'R':
                    if (currentCol + 1 < n && matrix[currentRow][currentCol + 1] == -1)
                    {
                        currentCol++;
                        validMove = true;
                    }
                    break;
                case 'D':
                    if (currentRow + 1 < m && matrix[currentRow + 1][currentCol] == -1)
                    {
                        currentRow++;
                        validMove = true;
                    }
                    break;
                case 'L':
                    if (currentCol - 1 >= 0 && matrix[currentRow][currentCol - 1] == -1)
                    {
                        currentCol--;
                        validMove = true;
                    }
                    break;
                case 'U':
                    if (currentRow - 1 >= 0 && matrix[currentRow - 1][currentCol] == -1)
                    {
                        currentRow--;
                        validMove = true;
                    }
                    break;
            }

            if (validMove) break;
            else
            {
                moveAttempts++;
                directionIndex = (directionIndex + 1) % direction.Length;
            }
        }

        if (moveAttempts == direction.Length) break;
    }

    return matrix;
}

Comments

Popular posts from this blog

Changing the root of a binary tree

ProjectEuler Problem 719 (some hints, but no spoilers)

Hard Leetcode Problem: Grid Illumination