Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
Example 1:
Input:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
Output: [1,2,3,6,9,8,7,4,5]
Example 2:
Input:
[
[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]
思路:按照题意一圈一圈遍历,要特别注意一圈一圈遍历之后最后只剩下一行数据的情况,这种情况特判一下就行了
/**
* @param {number[][]} matrix
* @return {number[]}
*/
var spiralOrder = function(matrix) {
let top = 0
let bottom = matrix.length
let right = 0
if(bottom)
right = matrix[0].length
else return []
let ans = []
if(bottom === 1)
return matrix[0]
if(right === 1) {
for(let i = 0; i < bottom; i ++) {
ans.push(matrix[i][0])
}
return ans
}
while(top + 1 < bottom && top + 1 < right) {
// 放过每行的最后一个元素
for(let i = top; i < right - 1; i ++) {
ans.push(matrix[top][i])
}
//console.log(ans)
// 收下每行的最后一个元素
for(let i = top; i < bottom - 1; i ++) {
ans.push(matrix[i][right - 1])
}
//console.log(ans)
for(let i = right - 1; i > top; i --) {
ans.push(matrix[bottom - 1][i])
}
//console.log(ans)
for(let i = bottom - 1; i > top; i --) {
ans.push(matrix[i][top])
}
//console.log(ans)
top ++
bottom --
right --
}
if(matrix.length > 2 && (matrix[0] && matrix[0].length > 2)) {
if(matrix[0].length % 2) for(let i = top; i < bottom; i ++) ans.push(matrix[i][right - 1])
else if(matrix.length % 2) for(let i = top; i < right; i ++) ans.push(matrix[top][i])
}
return ans
};
Runtime: 68 ms, faster than 44.38% of JavaScript online submissions for Spiral Matrix.
Memory Usage: 34 MB, less than 100.00% of JavaScript online submissions for Spiral Matrix.