Spiral Matrix
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example, 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].
Solution
class Solution(object):
    def spiralOrder(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[int]
        """
        res = []
        if not matrix:
            return res
        i, j, di, dj = 0, 0, 0, 1
        m, n  = len(matrix), len(matrix[0])
        for x in range(m * n):
            res.append(matrix[i][j])
            matrix[i][j] = ""
            if matrix[(i + di) % m][(j + dj) % n] == "":
                di, dj = dj, -di
            i += di
            j += dj
        return res
public class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> result = new ArrayList<>();
        if(matrix.length == 0) return result;
        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 i = colBegin;i<=colEnd;i++)
                result.add(matrix[rowBegin][i]);
            rowBegin++;
            // traverse down
            for(int i = rowBegin;i<=rowEnd;i++)
                result.add(matrix[i][colEnd]);
            colEnd--;
            // traverse left
            if(rowBegin <= rowEnd) {
                for(int i = colEnd;i>=colBegin;i--)
                    result.add(matrix[rowEnd][i]);
                rowEnd--;
            }
            // traverse up
            if(colBegin <= colEnd) {
                for(int i = rowEnd;i>=rowBegin;i--)
                    result.add(matrix[i][colBegin]);
                colBegin++;
            }
        }
        return result;
    }
}