给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 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]
提示:
- m == matrix.length
- n == matrix[i].length
- 1 <= m, n <= 10
- -100 <= matrix【i】【j】<= 100
题解
这一题真的还挺有意思的,虽然但是,我还是解了两个小时。
在解题思路上,我觉得这题还算是比较新颖的,LeetCode上给出两道解法。我采用的是第二种,撞墙法,也就是按照题意,按方向走下去。走过的点就标记。
定义方向数组
最开始拿到题目的时候,在想是不是要定义一个与方向有关的数组,为了验证我的想法专门去看了题解,但是没想通为什么要这样去定义,后来才想明白。以示例1的图为例,当我们从1走到3时,我们的坐标是(0,0)(0,1)(0,2)每次都是y坐标加一,而x坐标不变(即加0),所以对应的方向坐标是[0,1]。其他的也是如此。
curDir
在创建这个变量的时候,最开始是将它声明为一个数组
curDir = dir[0];
但是后面用的时候发现真的很不好进行方向的变换,所以最后用指针的思想取代了。
判断越界条件
最开始在写if的条件时,没有考虑周全,导致我提交一直报错,卡了很久,最后是在vscode里调试出来的,真的头疼,我觉得写if的判断条件是个很凭经验的东西然而我的经验还不是很多,还要慢慢的积累。
var spiralOrder = function(matrix) {
const num=[];
let m = matrix.length;//矩阵的行数1
let n = matrix[0].length;//矩阵的列数2 00
var dir = [[0,1],[1,0],[0,-1],[-1,0]];//定义方向数组
var curDir = 0;//dir的指针
var x = 0,y = 0;//用于记录当前需要录入的数的横纵坐标。
for(let i = 0;i<m*n;i++){
num.push(matrix[x][y]);
matrix[x][y] = 999;//已经录入的数就标记
//计算出下一次的数,以便于判断是否要转换方向
var nextX = x+dir[curDir][0];
var nextY = y+dir[curDir][1];
//越界处理,转换方向
if(!(0<=nextX && nextX<m && 0<=nextY && nextY<n && matrix[nextX][nextY]<=100)){
curDir++;
}
curDir = curDir%4;
x=x+dir[curDir][0];
y=y+dir[curDir][1];
}
return num;
};
最后想吐槽一下LeetCode的提交检验系统,这不就是个拼网速的东西吗,同一段代码提交三次,第一次92ms击败20%,第二次104ms击败5%,真是气死我了,虽然这东西也就图一乐,但你起码给我点面子,爷写了两个小时,你跟我说只击败了5%???(无语子。。)