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].

Analysis

每次走一圈并且及时调整index范围,具体见code。

Code

public class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> answer = new ArrayList<Integer>();
        int r = matrix.length;
        if (r==0) {return answer;}
        int l = matrix[0].length;

        int rowBegin = 0;
        int rowEnd = r-1;
        int colBegin = 0;
        int colEnd = l-1;

        //每个循环对应走一圈
        while(rowBegin<=rowEnd && colBegin <= colEnd){
            //向右走
            for(int j=colBegin; j<=colEnd; j++) {answer.add(matrix[rowBegin][j]);}
            rowBegin++;

            //向下走
            for(int i=rowBegin; i<=rowEnd; i++) {answer.add(matrix[i][colEnd]);}
            colEnd--;

            //向左走
            //注意if很重要,可能经过上面,在同一个圈里已经不符合while的条件了
            if(rowBegin<=rowEnd){
                for(int j=colEnd; j>=colBegin; j--) {answer.add(matrix[rowEnd][j]);}
            }
            rowEnd--;

            //向上走
            //注意if很重要,可能经过上面,在同一个圈里已经不符合while的条件了
            if(colBegin<=colEnd){
                for(int i=rowEnd; i>=rowBegin; i--) {answer.add(matrix[i][colBegin]);}
            }
            colBegin++;
        }

        return answer;
    }
}

Reference

Leetcode