# Spiral Order Print II

Traverse an M \* N 2D array in spiral order clock-wise starting from the top left corner. Return the list of traversal sequence.

**Assumptions**

* The 2D array is not null and has size of M \* N where M, N >= 0

**Examples**

{ {1,  2,  3,  4},

&#x20; {5,  6,  7,  8},

&#x20; {9, 10, 11, 12} }

the traversal sequence is \[1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7]

**Solution:** iterative four pointers, which together outlines the current printing rectangle

Base Case:&#x20;

Nothing left: left > right || up > down

One row left: up == down

One column left: left == right

Iterative Steps:

Print top side, right side, bottom side, left side

```
 public class Solution {

  public List<Integer> spiral(int[][] matrix) {
    List<Integer> result = new ArrayList<>();

    int m = matrix.length;
    if (m == 0) return result;
    int n = matrix[0].length;

    

    int left = 0;
    int right = n - 1;
    int up = 0;
    int down = m - 1;

    while (left < right && up < down){
      //top side
      for (int i = left; i <= right; i++){
        result.add(matrix[up][i]);
      }
      //right side
      for (int i = up + 1; i < down; i++){
        result.add(matrix[i][right]);
      }
      //bottom side
      for (int i = right; i >= left; i--){
        result.add(matrix[down][i]);
      }
      //left side
      for (int i = down - 1; i > up; i--){
        result.add(matrix[i][left]);
      }
      left++;
      right--;
      up++; 
      down--;
    }

    //base cases
    //nothing left
    if (left > right || up > down) return result;

    //one column left
    if (left == right){
      for (int i = up; i <= down; i++){
        result.add(matrix[i][left]);
      }
      return result;
    } else { //one row left
      for (int i = left; i <= right; i++){
        result.add(matrix[up][i]);
      }
      return result;
    }
  }
}
```
