给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/spiral-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思考
1.我们要像卷心蛋糕那样一层一层去遍历。这个遍历有个特点,都是右,下,左,上。而且遍历的时候不能重复。所以可以给四周设定边界,当那一行或者一列遍历完,边界缩小。
2.循环的条件while(top<=bottom && left <= right).因为在下图中特殊情况的时候,第5条线遍历完,此时,top = bottom =2,还没有遍历完,第6条线把11遍历了,right = 2-1 =1。 此时right = left, top = bottom,还要继续遍历最后一下,将10加入。所以,等号的临界条件是成立的。
代码实现
/**
* @param {number[][]} matrix
* @return {number[]}
*/
var spiralOrder = function(matrix) {
if (matrix.length === 0){
return []
}
let result = []
let top = 0,
bottom = matrix.length - 1, //获取数组的行数,-1得下边界
left = 0,
right = matrix[0].length - 1 //获取数组的列数,-1得右边界
let direction = 'right' //定义初始遍历方向
while (top <= bottom && left <= right) {
if (direction === 'right') {
for (let i = left; i<=right; i++) {
result.push(matrix[top][i])
}
top++;
direction = 'down'
}else if (direction === 'down') {
for (let i = top; i<= bottom; i++) {
result.push(matrix[i][right])
}
right--;
direction = 'left'
} else if (direction === 'left') {
for (let i = right; i >= left; i--) {
result.push(matrix[bottom][i])
}
bottom--;
direction = 'up'
}else if (direction === 'up') {
for (let i = bottom; i >= top; i--) {
result.push(matrix[i][left])
}
left++;
direction = 'right'
}
}
return result
};
知识
1.js中,二维数组的行数:matrix.length。二维数组的列数: matrix[0].length.原理,matrix.length是matrix里面包含了多少个数组元素,就是行数。matrix[0].length就是里面第一个数组有几个元素,也就是列。
复习:
9.13