Given an m x n
matrix
, return all elements of the matrix
in spiral order.
Example 1:
Input: matrix = [[1,2,3],[4,5,6],[7,8,9]] Output: [1,2,3,6,9,8,7,4,5]
Example 2:
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]
Constraints:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
Solution:
/**
* @param {number[][]} matrix
* @return {number[]}
*/
var spiralOrder = function(matrix) {
if (matrix === null) return null
let res = [];
let l = 0;
let t = 0;
let r = matrix[0].length - 1;
let b = matrix.length - 1;
const total = (r + 1) * (b + 1);
let d = 0;
let x = 0;
let y = 0;
while (res.length < total - 1) {
// right
if (d === 0) {
while (x < r) res.push(matrix[y][x++]);
t++; // reach end, turn 90 degree, move down
// down
} else if (d === 1) {
while (y < b) res.push(matrix[y++][x]);
r--; // reach end, turn 90 degree, move left
// left
} else if (d === 2) {
while (x > l) res.push(matrix[y][x--]);
b--; // reach end, turn 90 degree, move up
// up
} else if (d === 3) {
while (y > t) res.push(matrix[y--][x]);
l++; // reach end, turn 90 degree, move up right
}
d = (d + 1) % 4;
}
// last move to the center if exist
if (res.length !== total)
res.push(matrix[y][x]);
return res;
};