力扣54题螺旋矩阵题解

204 阅读2分钟

1.jpg Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目:

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

 

示例1

image.png

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

示例2

image.png

输入: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]

 

题解:

思路:

循环大数组

如果是偶数行,将大数组的第一个小数组,以及其余小数组的最后一个数放进需返回的数组中

如果是奇数行,将大数组的最后一个小数组,以及其余小数组的第一个数放进需返回的数组中

取出数之后就把已取过的数移除,直到最后所有的数据组装完成(即所有的数组都为空)

 

再通熟易懂一点的就是看下面的图:一直执行红色的线就可以了

image.png

image.png

一直循环以上两步即可

inedx方向matrixresult
0right[[2,3,4],[5,6,7],[8,9,10],[11,12,13],[14,15,16]][2,3,4,7,10,13,16]
1left [[5,6],[8,9],[11,12],[14,15]] [2,3,4,7,10,13,16,15,14,11,8,5]
2right[[6],[9],[12]] [2,3,4,7,10,13,16,15,14,11,8,5,6,9,12]
3left [[],[],[]]  

需要注意的点

在循环中,各数组的(最大的数组、里面的小数组)的长度都是在变化的

具体代码实现:

spiralOrder(data){
    const result = [];
    for(let i=0;i<data.length;i++){
        if(i%2 === 0 && data[0].length>0){
            // 先取大数组的第一个数组
            result.push(...data[0])
            // 将大数组的第一个数组移除
            data.shift();
            // 取剩下数组的最后一个数;这里需要重新计算数组长度
            for(let j=0;j<data.length;j++){
                result.push(data[j][data[j].length - 1]);
                data[j].pop()
            }
        }else if(i%2 === 1 && data[data.length - 1].length>0){
            // 先取大数组的最后一个数组
            result.push(...data[data.length - 1].reverse());
            data.pop();
            // 取小数组的第一个
            for(let j=data.length - 1;j>0;j--){
                result.push(data[j][0]);
                data[j].shift()
            }
        }
        // 如果大数组里面的小数组全部变成空则返回
        if(data[i] && data[i].length === 0){
            return result
        }
    }
    return result
}

总结:

算法题的解法不唯一,多思考多尝试,然后总结规律

最后:

如果有更好的思路欢迎留言~~