LeetCode 54 :螺旋矩阵

157 阅读3分钟

给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:

img

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例 2:

img

输入: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%???(无语子。。)