• 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;
                }
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76

    5).总结

    • 细节问题

    试题链接:

  • 相关阅读:
    完美解决 RabbitMQ可视化界面Overview不显示折线图和队列不显示Messages
    android 自定义View:仿QQ拖拽效果
    JAVA电视设备租借系统计算机毕业设计Mybatis+系统+数据库+调试部署
    检查原生 JavaScript 函数是否被覆盖
    批量多字段唯一性校验
    SpringBoot数据层解决方案/ 内置持久化解决方案JdbcTemplate使用/内置数据库H2使用以及RedisNoSql使用
    4. Pandas行列操作
    D2--FPGA SPI接口通信2022-08-03
    Meta 推出新型多模态 AI 模型“变色龙”(Chameleon),挑战 GPT-4o,引领多模态革命
    Three.js 进阶之旅:物理效果-碰撞和声音 💥
  • 原文地址:https://blog.csdn.net/weixin_56715699/article/details/132793487