LeetCode Notes: Spiral Matrix
Question
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
Analysis:
- Set
up
/down
/left
/right
start and end position variables - Traverse horizontally and vertically according to the requirements, each time one direction is traversed, the start and end positions will be reduced to achieve the spiral effect
Code:
/**
* @param {number[][]} matrix
* @return {number[]}
*/
var spiralOrder = function(matrix) {
// is empty judgment
if(matrix.length === 0) return []
// Store the result array
const result = []
// Get the initial element position information
let left = 0, right = matrix[0].length-1,
top = 0, bottom = matrix.length-1
while(true){
// Traverse to the right
for(let i = left; i <= right; i++){
result.push(matrix[top][i])
}
// The traversal is over, the top value just traversed is no longer used, the upper boundary needs to move down by +1, if the top value exceeds the bottom value, it means that the vertical traversal has ended, exit the loop
if(++top> bottom) break
// traverse down
for(let i = top; i <= bottom; i++){
result.push(matrix[i][right])
}
// The traversal is over, the right value just traversed is no longer used, the right boundary needs to be moved to the left by -1, if the right value is less than the left value, it means that the horizontal traversal has ended, exit the loop
if(--right <left) break
// Traverse left
for(let i = right; i >= left; i--){
result.push(matrix[bottom][i])
}
// The traversal is over, the bottom value just traversed is no longer used, the lower boundary needs to move up by -1, if the bottom value is less than the top value, it means that the vertical traversal has ended, exit the loop
if(--bottom <top) break
// traverse upward
for(let i = bottom; i >= top; i--){
result.push(matrix[i][left])
}
// The traversal is over, the left value just traversed is no longer used, the left boundary needs to move to the right by +1, if the left value is greater than the right value, it means that the horizontal traversal has ended, exit the loop
if(++left> right) break
}
return result
};
Comments