输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
限制:
- 0 <= matrix.length <= 100
- 0 <= matrix[i].length <= 100
解题思路
1.首先对数组进行判空,然后定义left、right、top、bottom四个变量的值以及result结果数组,接着进行顺时针方向遍历
2.从左到右遍历,以 left 开始,right 结束,该行遍历完,向下移动一行,如果上边边界大于下边边界了,遍历完成,跳出。
3.从上到下遍历,以 top 开始,bottom结束,该列遍历完,向左移动一列,如果右边边界小于左边边界了,遍历完成,跳出
4.从右到左遍历,以 right 开始,left 结束,该行遍历完,向上移动一行,如果下边边界小于上边边界了,遍历完成,跳出
5.从下到上遍历,以 bottom 开始,top 结束,该列遍历完,向右移动一列,如果左边边界大于右边边界了,遍历完成,跳出
代码
/**
* @param {number[][]} matrix
* @return {number[]}
*/
var spiralOrder = function(matrix) {
if(!matrix.length || !matrix[0].length) return [];
let left = 0, right = matrix[0].length - 1, top = 0, bottom = matrix.length - 1, result = [];
while(true) {
// 从左到右,以 left 开始,right 结束
for(let i = left; i <= right; i++)
result.push(matrix[top][i]);
if(++top > bottom) break; // 该行遍历完,向下移动一行,如果上边边界大于下边边界了,遍历完成,跳出
// 从上到下遍历,以 top 开始,bottom结束
for(let j = top; j <= bottom; j++)
result.push(matrix[j][right]);
if(--right < left) break; // 该列遍历完,向左移动一行,如果右边边界小于左边边界了,遍历完成,跳出
// 从右到左遍历,以 right 开始,left 结束
for(let i = right; i >= left; i--)
result.push(matrix[bottom][i]);
if(--bottom < top) break; // 该行遍历完,向上移动一行,如果下边边界小于上边边界了,遍历完成,跳出
// 从下到上遍历,以 bottom 开始,top 结束
for(let j = bottom; j >= top; j--)
result.push(matrix[j][left]);
if(++left > right) break; // 该列遍历完,向右移动一行,如果左边边界大于右边边界了,遍历完成,跳出
}
return result;
};