# LC 54 Spiral Matrix(M)

Given a matrix ofmxnelements (mrows,ncolumns), return all elements of the matrix in spiral order.

Given the following matrix:

\[\
\[ 1, 2, 3 ],

\[ 4, 5, 6 ],

\[ 7, 8, 9 ]\
]

You should return\[1,2,3,6,9,8,7,4,5].

`publicList<Integer>spiralOrder(int[][] matrix){`

**解题思路: 定义4个行列指针。**

**边界判断** 因为输入只有数组，所以要判断没有行的情况，无法取得列行

if(matrix.length==0) {return res; }

traverse right and increment rowBegin, then traverse down and decrement colEnd, then I traverse left and decrement rowEnd, and finally I traverse up and increment colBegin.

The only tricky part is that when I traverse left or up I have to check whether the row or col still exists to prevent duplicates

```
public List<Integer> spiralOrder(int[][] matrix) {    
        List<Integer> res = new ArrayList<Integer>();     
        if (matrix.length == 0) { 
            return res; 
        } 

        int rowBegin = 0; 
        int rowEnd = matrix.length-1; 
        int colBegin = 0; 
        int colEnd = matrix[0].length - 1; 

        while (rowBegin <= rowEnd && colBegin <= colEnd) { 
            // Traverse Right 
            for (int j = colBegin; j <= colEnd; j ++) { 
                res.add(matrix[rowBegin][j]); 
            } 
            rowBegin++; 

            // Traverse Down 
            for (int j = rowBegin; j <= rowEnd; j ++) { 
                res.add(matrix[j][colEnd]); 
            } 
            colEnd--; 

            if (rowBegin <= rowEnd) { 
                // Traverse Left 
                for (int j = colEnd; j >= colBegin; j --) { 
                    res.add(matrix[rowEnd][j]); 
                } 
            } 
            rowEnd--; 

            if (colBegin <= colEnd) { 
                // Traver Up 
                for (int j = rowEnd; j >= rowBegin; j --) { 
                    res.add(matrix[j][colBegin]); 
                } 
            } 
            colBegin ++; 
        }        
        return res; 
    }
```
