算法题记录【leetcode 498】对角线遍历

题目描述

思路分析 :

思路一:可以理解为每一条直线的横向坐标和纵向坐标一致为k,向上和向下的区别在于开始阶段例如横坐标为0,则纵坐标为k,之后就会变成:横坐标++和纵坐标--的问题,直至横坐标为k,纵坐标为0;依照此逻辑循环;

思路二:将左上或右下为折返点,如果碰到右侧或左侧的折返点则修改方向,y轴不动,x轴往下;同理,碰到上侧或下侧的折返点则修改方向,x轴不动,y轴往右;

思路三:将数组平铺来看,构造一个长度为n+m-1的空间,依照当前空间下标来判断数组的移动方向(从上至下或从下至上)

 代码解析

思路二:

var findDiagonalOrder = function(mat) {
    const result = [];
    const m = mat.length, n = mat[0].length;
    // 方向两个,1代表右上,2代表左下
    let direction = 1;
    // 起点
    let [x, y] = [0, 0];
    // 如果结果的长度和传入的值长度不同则继续轮询
    while(result.length !== m * n){
        result.push(mat[x][y]);
        // 右上
        if(direction === 1){
            if(y === n - 1){
                //如果碰到右侧的墙壁则修改方向
                // 右侧修改方向时,y轴不动,x轴往下
                x += 1;
                direction = 2;
            }else if(x === 0){
                // 如果碰到上侧的墙壁则修改方向
                // x轴不动,y轴向右
                y += 1;
                direction = 2;
            }else{
                x -= 1;
                y += 1;
            }
        }else{
            // 左下
            if(x === m - 1){
                // 如果碰到下侧的墙壁则修改方向
                // x轴不同,y轴向右
                y += 1;
                direction = 1;
            } else if(y === 0){
                // 如果碰到左侧的墙壁则修改方向
                // y轴不懂,x轴向下
                x += 1;
                direction = 1;
            }else{
                x += 1;
                y -= 1;
            }
        }
    }
    return result;
};

作者:uniquelee
链接:https://leetcode.cn/problems/diagonal-traverse/solution/jsdui-jiao-xian-bian-li-by-uniquelee-dunc/

思路三:

/**
 * @param {number[][]} mat
 * @return {number[]}
 */
var findDiagonalOrder = function(mat) {
    const m = mat.length;
    const n = mat[0].length;
    const res = new Array(m*n).fill(0);
    let pos = 0 ;
    for(let i = 0;i<m+n-1;i++){
        if(i%2 === 1){
            //判断i值是否越界
            let x = i<n?0:i-n+1;
            let y = i<n?i:n-1;
            while(x<m && y>=0){
                res[pos] = mat[x][y];
                pos++;
                x++;
                y--;
            }
        }else{
            let x=i<m?i:m-1;
            let y=i<m?0:i-m+1;
            while(x>=0&&y<n){
                res[pos] =mat[x][y];
                pos++;
                x--;
                y++;
            }
        }
    }
    return res
};

后话

只是记录,正在找工作中,各位老板缺前端的可以私信,会vue,react,ts,js,22届本科毕业,一年工作经验

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值