Leetcode: Spiral Matrix

 This question is asked quite frequently at Microsoft and Amazon. It is the following:

Given an m x n matrix, return all elements of the matrix in spiral order. 


So as a result, the drawing should look like this: 

It's a pretty simple question so, let's get to the examples.

Input: matrix = [[1,2,3],[4,5,6],[7,8,9]]
Output: [1,2,3,6,9,8,7,4,5]

Input: matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]

To solve this problem, traverse to the right and increment the first row, and then traverse down and traverse left and decrement the last row and traverse up and increment beginning column. 

You also have to check to see if a row or column still exists in order to prevent duplicates.

Here's the code, which traverses right, down, left and up.

public class Solution {

    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){

            for(int j = colBegin; j <= colEnd; j++){

                res.add(matrix[rowBegin][j]);

            }

            rowBegin++;

            for(int j = rowBegin; j <= rowEnd; j++){

                res.add(matrix[j][colEnd]);

            }

            colEnd--;

            if(rowBegin <= rowEnd) {

                for(int j = colEnd; j >= colBegin; j--) {

                    res.add(matrix[rowEnd][j]);

                }

            }

            rowEnd--;

            if(colBegin <= colEnd) {

                for(int j = rowEnd; j >= rowBegin; j--){

                    res.add(matrix[j][colBegin]);

                }

            }

            colBegin++;

        }

        return res;

    }

}

Comments

Popular Posts