螺旋矩阵 js

思路

1.矩阵遍历是顺时针遍历

2.先遍正序历数组第一个元素数组,再正序遍历数组每个元素数组的最后一个元素

3.再逆序遍历数组最后一个元素数组

4.再从下到上也就是(逆序)遍历每个数组的第一个元素。

这个是思路

具体执行

1. 一个state用来做状态存储,上面四个思路对应四个状态。

2.上面四个思路,每次遍历完都需要删除相对应元素或者数组

2. 使用while 循环,循环的条件就是 数组长度不为空;

下面是具体代码

/**
 *
 * @param matrix int整型二维数组
 * @return int整型一维数组
 */
function ddelete(matrix){
    for (let i = matrix.length - 1; i >= 0; i--) {
        if (matrix[i].length == 0) {
            matrix.splice(i, 1);
        }
    }
}
 function spiralOrder(matrix) {
            // write code here
            if (matrix.length === 0) return [];
            const arry = [];
            let state = 1;
            //     var l = 0, r = matrix[0].length -1,
            //         t = 0, b = matrix.length -1;
            while (matrix.length) {
                if (state == 1 && matrix.length) {
                    for (let i = 0; i < matrix[0].length; i++) {
                        arry.push(matrix[0][i]);
                    }
                    matrix.shift();
                    state = 2;
                }

                if (state == 2 && matrix.length) {
                    for (let i = 0; i < matrix.length; i++) {
                        arry.push(matrix[i].pop());
                    }
                    ddelete(matrix);
                    state = 3;
                }
                if (state == 3 && matrix.length) {
                    const t = matrix[0].length - 1;
                    const end = matrix.length - 1;
                    for (let i = t; i >= 0; i--) {
                        arry.push(matrix[end][i]);
                    }
                    matrix.pop();
                    state = 4;
                }
                if (state == 4 && matrix.length) {
                    const end = matrix.length - 1;
                    for (let i = end; i >= 0; i--) {
                        arry.push(matrix[i].shift());
                    }
                    ddelete(matrix);
                    state = 1;
                }
            }
            return arry;
        }
module.exports = {
    spiralOrder : spiralOrder
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值