LeetCode算法心得——判断能否在给定时间到达单元格(动态模拟)

大家好,我是晴天学长,这是一个动态模拟题,跟大佬相比,我的有点繁琐了,但是也算是锻炼到自己的一些细节问题,需要的小伙伴可以关注支持一下哦!后续会继续更新的。


1) .判断能否在给定时间到达单元格

在这里插入图片描述


2) .算法思路

判断能否在给定时间到达单元格
1.对角线永远是最快的
2.所以算出至少要多少秒,就知道能不能恰好到达了。
3.判定
1.当不在一条直线上,直接走对角线(作图直接减坐标,就理解一些)
终点在右上方,左上方
x++,y-- x-- y–
重点在右下方 左下方
x++ y++ x-- y++
2.当在一条直线上时,直接ans+=距离


3) .算法步骤

首先,进行一些边界判断,如果时间 t 为0,则判断起点和终点是否相同,相同则返回true,不同则返回false。
如果起点和终点相同,且时间 t 为1,则返回false;否则返回true。
初始化变量 time 为0,表示移动的总时间。
根据起点和终点的位置关系,确定移动的方向。根据起点和终点的横坐标和纵坐标的大小关系,设置变量 dx 和 dy 的值,表示移动的方向。
根据移动的方向,计算移动的时间,即取横坐标和纵坐标之差的绝对值的较小值,并将起点的坐标更新为移动后的位置。
如果起点的横坐标与终点的横坐标相等,但纵坐标不相等,则将移动的时间加上终点纵坐标与起点纵坐标之差的绝对值。
如果起点的纵坐标与终点的纵坐标相等,但横坐标不相等,则将移动的时间加上终点横坐标与起点横坐标之差的绝对值。
判断移动的总时间是否小于等于给定的时间 t,如果是则返回true,否则返回false。


4).代码示例

class Solution {
        static int[] dxtemp = {1, -1};
        static int[] dytemp = {1, -1};

        public  boolean isReachableAtTime(int sx, int sy, int fx, int fy, int t) {
            if (t==0){
                if (sx==fx&&sy==fy){
                    return true;
                }
                else {
                    return false;
                }
            }
            if (sx==fx&&sy==fy){
                if (t==1){
                    return false;
                }
                else {
                    return true;
                }
            }
            long time = 0;
            //对角线的偏移量
            int dx = 0;
            int dy = 0;
            //判断方位
            //右边
            if (sx < fx) {
                if (sy < fy) {
                    dx = dxtemp[0];
                    dy = dytemp[0];
                } else {
                    dx = dxtemp[0];
                    dy = dxtemp[1];
                }
            }
            //左边
            else if (sx > fx) {
                if (sy < fy) {
                    dx = dxtemp[1];
                    dy = dytemp[0];
                } else {
                    dx = dxtemp[1];
                    dy = dxtemp[1];
                }

            } else {
                if (sx == fx) {
                    if (Math.abs(fy - sy) <= t) {
                        return true;
                    } else {
                        return false;
                    }
                } else {
                    if (Math.abs(fx - sx) <= t) {
                        return true;
                    } else {
                        return false;

                    }
                }
            }
            // 开始移动
            time = Math.min(Math.abs(fx-sx), Math.abs(fy-sy));
            sx +=time*dx;
            sy +=time*dy;

            time += sx == fx && sy!=fy ? Math.abs(fy - sy) : 0;
            time += sy == fy && sx!=fx ? Math.abs(fx - sx) : 0;
            if (time <= t) {
                return true;
            } else {
                return false;
            }
        }
    }

5).总结

  • 细节问题

试题链接:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晴天学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值