题目描述
思路分析 :
思路一:可以理解为每一条直线的横向坐标和纵向坐标一致为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届本科毕业,一年工作经验