(js)leetcode 1030. 距离顺序排列矩阵单元格

题目:

给出 R 行 C 列的矩阵,其中的单元格的整数坐标为 (r, c),满足 0 <= r < R 且 0 <= c < C。

另外,我们在该矩阵中给出了一个坐标为 (r0, c0) 的单元格。

返回矩阵中的所有单元格的坐标,并按到 (r0, c0) 的距离从最小到最大的顺序排,其中,两单元格(r1, c1) 和 (r2, c2) 之间的距离是曼哈顿距离,|r1 - r2| + |c1 - c2|。(你可以按任何满足此条件的顺序返回答案。)

 

示例 1:

输入:R = 1, C = 2, r0 = 0, c0 = 0
输出:[[0,0],[0,1]]
解释:从 (r0, c0) 到其他单元格的距离为:[0,1]
示例 2:

输入:R = 2, C = 2, r0 = 0, c0 = 1
输出:[[0,1],[0,0],[1,1],[1,0]]
解释:从 (r0, c0) 到其他单元格的距离为:[0,1,1,2]
[[0,1],[1,1],[0,0],[1,0]] 也会被视作正确答案。
示例 3:

输入:R = 2, C = 3, r0 = 1, c0 = 2
输出:[[1,2],[0,2],[1,1],[0,1],[1,0],[0,0]]
解释:从 (r0, c0) 到其他单元格的距离为:[0,1,1,2,2,3]
其他满足题目要求的答案也会被视为正确,例如 [[1,2],[1,1],[0,2],[1,0],[0,1],[0,0]]。
 

提示:

1 <= R <= 100
1 <= C <= 100
0 <= r0 < R
0 <= c0 < C

今天的这道题挺简单的,按照自己的思路去将这道题解了出来,但是看了官方的解答之后,觉得自己果真是脑子不常用,懂得太少了。

虽然思路一样,但是官方的解答非常简洁。

我还是先将自己的解法列出来,然后再将按官方的java代码改写为js代码的解法写在下面,这样以后还能看到自己的成长。

思路:

1. 直接计算出每个点与当前点的距离

2. 将这些点按距离排序

代码实现:

个人:

/**
 * @param {number} R
 * @param {number} C
 * @param {number} r0
 * @param {number} c0
 * @return {number[][]}
 */
var allCellsDistOrder = function(R, C, r0, c0) {
    let disArr =[];
    for(let i=0;i<R;i++){
        for(let j=0;j<C;j++){
            let dis = Math.abs(i-r0) + Math.abs(j-c0);
            let index = disArr.findIndex(item=>item.dis===dis);
            // dis 存放距离, value 中存放距离为 dis 的所有点
            if(index===-1){
                disArr.push({dis:dis,value:[[i,j]]})
            }else{
                disArr[index].value.push([i,j]);
            }
        }
    }
    let resArr = [];
    // 按距离从小到大排序
    disArr.sort((a,b)=>{return a.dis-b.dis});
    disArr.forEach(item=>{
        item.value.forEach(v=>{
            resArr.push(v)
        })
    })
    return resArr;
};

官方:

/**
 * @param {number} R
 * @param {number} C
 * @param {number} r0
 * @param {number} c0
 * @return {number[][]}
 */
var allCellsDistOrder = function(R, C, r0, c0) {
    let resArr =[];
    for(let i=0;i<R;i++){
        for(let j=0;j<C;j++){
            resArr.push([i,j]);
        }
    }
    
    // 这里直接按照 计算的结果 排序,我竟然没有想到,不过下次我就能想到啦
    resArr.sort((a,b)=>{
        return (Math.abs(a[0]-r0)+Math.abs(a[1]-c0)) - (Math.abs(b[0]-r0)+Math.abs(b[1]-c0))
    });
    
    return resArr;
};

运行结果:

个人:

官方:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值