54 Spiral Matrix

https://leetcode.com/problems/spiral-matrix/

class Solution {
    List<Integer> ans = new ArrayList<>();
    public List<Integer> spiralOrder(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        collect(matrix, 0, n-1, m-1, 0);
        return ans;
    }
    
    private void collect(int[][] matrix, int urow, int rcol, int drow, int lcol) {
        if (lcol > rcol || urow > drow) {
            return;
        }
        if (lcol == rcol) {
            for (int i = urow; i <= drow; i++) {
                ans.add(matrix[i][lcol]);
            }
            return;
        } else if (urow == drow) {
            for (int i = lcol; i <= rcol; i++) {
                ans.add(matrix[urow][i]);
            }
            return;
        }
        // row is up
        for (int i = lcol; i < rcol; i++) {
            ans.add(matrix[urow][i]);
        }
        // col is right
        for (int i = urow; i < drow; i++) {
            ans.add(matrix[i][rcol]);
        }
        // row is down
        for (int i = rcol; i > lcol; i--) {
            ans.add(matrix[drow][i]);
        }
        // col is left
        for (int i = drow; i > urow; i--) {
            ans.add(matrix[i][lcol]);
        }

        collect(matrix, urow+1, rcol-1, drow-1, lcol+1);
    }
}

Last updated