携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情
题目
给你一个
m行n列的矩阵matrix,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
输入: matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出: [1,2,3,6,9,8,7,4,5]
题解
这道题很多人看到了会一脸懵,这道题的意思是我们先走1>2>3,到了3之后往下走3>6>9到了9之后往左边走,9>8>7到了7之后往上走,7>4这里不能在往前走了,因为1我们已经走过了,到了4之后我们在走4>5,最后行程了我们当前看到的1>2>3>6>9>8>7>4>5,这道题的难点在于边界的问题
我们根据刚刚分析的得出,它所去读取数字的方向为右下左上的顺序,我们去定义四个边界变量以及当前所行走的方向,添加一个
while循环判断条件为当左边界小于等于右边界且上边界小于等于下边界时执行,这也是这道题最复杂的地方,按照右下左上的顺序,我们依次将路径上的字符添加到结果中,最后while循环结束,返回结果
/**
* @param {number[][]} matrix
* @return {number[]}
*/
var spiralOrder = function(matrix) {
if(!matrix.length)return [];
// 定义上边界
let top=0;
// 定义下边界
let bottom =matrix.length-1;
// 定义左边界
let left=0;
// 定义右边界
let right =matrix[0].length-1;
// 定义开始方向
let direction="right";
// 定义接收结果数组
let result=[]
// 循环并添加判断条件
while(left<=right&&top<=bottom){
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="top"
}
}else if(direction=="top"){
// 方向向上执行
for(let i=bottom;i>=top;i--){
// 将数据添加到结果数据中
result.push(matrix[i][left])
left++;
// 方向改变向右
direction="right"
}
}
// 将结果返回
return result
}
};
坚持努力,无惧未来!