【每日一题Day310】LC1654到家的最少跳跃次数 | BFS

简介: 【每日一题Day310】LC1654到家的最少跳跃次数 | BFS

到家的最少跳跃次数【LC1654】

有一只跳蚤的家在数轴上的位置 x 处。请你帮助它从位置 0 出发,到达它的家。

跳蚤跳跃的规则如下:

  • 它可以 往前 跳恰好 a 个位置(即往右跳)。
  • 它可以 往后 跳恰好 b 个位置(即往左跳)。
  • 它不能 连续 往后跳 2 次。
  • 它不能跳到任何 forbidden 数组中的位置。

跳蚤可以往前跳 超过 它的家的位置,但是它 不能跳到负整数 的位置。

给你一个整数数组 forbidden ,其中 forbidden[i] 是跳蚤不能跳到的位置,同时给你整数 abx ,请你返回跳蚤到家的最少跳跃次数。如果没有恰好到达 x 的可行方案,请你返回 -1

思路:最短路问题,BFS

  • **BFS:**寻找最少跳跃次数,所以可以使用最短路径Dijkstra 算法,通过BFS实现,队列元素需要存储当前跳跃次数以及当前位置;
  • **记录状态:**由于跳跃时连续向前次数不受限制,但是不能连续向后跳两次,因此跳跃时还需要记录前一跳跃的状态为向后还是向前;
  • 如果前一状态为向前,那么本次可以向前也可以向后
  • 如果前一状态为向后,那么本次只可以向前
  • 判断是否可以访问:
  • 首先判断最远右边界,由于向前跳跃次数不受限制,避免超时,需要寻找最远右边界【重点】
  • 当前位置不在forbidden数组中
  • 之前没有访问过该状态【位置+方向】

image.png

class Solution {
    public int minimumJumps(int[] forbidden, int a, int b, int x) {
        Set<Integer> vis = new HashSet<>();
        Deque<int[]> pq = new LinkedList<>();// 跳跃次数、当前位置、连续向后跳次数
        int max = 0;       
        for (int f : forbidden){
            vis.add(f);
            max = Math.max(max, f);
        }      
        if (a > b){
            max = x + b;
        }else{
            max = Math.max(max + a + b, x);
        }
        boolean[][] flag = new boolean[max + 1][2];// 向前 向后一次
        flag[0][0] = true;
        pq.addLast(new int[]{0, 0, 0});
        while (!pq.isEmpty()){
            int[] node = pq.pollFirst();
            if (node[1] == x) return node[0]; 
            // 向前
            int forward = node[1] + a;
            if (forward <= max && !vis.contains(forward) && !flag[forward][0]){
                flag[forward][0] = true;
                pq.addLast(new int[]{node[0] + 1, forward, 0});
            }
            // 向后
            int backward = node[1] - b;
            if (node[2] != 1 && backward >= 0 && !vis.contains(backward) && !flag[backward][1]){
                flag[backward][1] = true;
                pq.addLast(new int[]{node[0] + 1, backward, 1});
            }
        }
        return -1;
    }
}


目录
相关文章
Altium Designer如何设定/修改PCB板边框外形
Altium Designer如何设定/修改PCB板边框外形
2746 0
|
JSON 小程序 数据格式
微信小程序的tabbar怎么配置
微信小程序的tabbar怎么配置
824 2
|
机器学习/深度学习 分布式计算 并行计算
MaxCompute-udf用于torch离线模型批量推理
odps-udf用于torch离线模型的批量推理实现以及踩坑
教大家用 Python 绘制几棵圣诞树~
今天分享五种用 Python 绘制圣诞树的方法,从基础到高级,效果也不断攀升分为 1 到 5 五个 Level 水平;
教大家用 Python 绘制几棵圣诞树~
|
6月前
|
算法 物联网 Swift
Qwen3 X ModelScope工具链: 飞速训练 + 全面评测
Qwen于近日发布了Qwen3系列模型,包含了各个不同规格的Dense模型和MoE模型。开源版本中,Dense模型基本沿用了之前的模型结构,差别之处在于对于Q和K两个tensor增加了RMSNorm;MoE模型去掉了公共Expert,其他结构基本与前一致。在模型大小上,涵盖了从0.6B到32B(Dense)和235B(MoE)不同的尺寸。
900 15
|
8月前
|
存储 人工智能 Java
一文彻底搞定C语言中的二维数组
本文详细介绍了C语言中的多维数组,包括二维和三维数组的定义、初始化方式、内存布局及遍历方法。通过具体示例讲解了多种赋值技巧,并强调了数组在内存中按行存放的特点。希望这些内容能帮助你在编程路上不断成长!君志所向,一往无前!
428 1
一文彻底搞定C语言中的二维数组
|
11月前
|
机器学习/深度学习 计算机视觉 网络架构
【YOLO11改进 - C3k2融合】C3k2DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目标检测
【YOLO11改进 - C3k2融合】C3k2DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目DWRSeg是一种高效的实时语义分割网络,通过将多尺度特征提取分为区域残差化和语义残差化两步,提高了特征提取效率。它引入了Dilation-wise Residual (DWR) 和 Simple Inverted Residual (SIR) 模块,优化了不同网络阶段的感受野。在Cityscapes和CamVid数据集上的实验表明,DWRSeg在准确性和推理速度之间取得了最佳平衡,达到了72.7%的mIoU,每秒319.5帧。代码和模型已公开。
【YOLO11改进 - C3k2融合】C3k2DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目标检测
|
算法 算法框架/工具 计算机视觉
Stable diffusion采样器详解
在我们使用SD web UI的过程中,有很多采样器可以选择,那么什么是采样器?它们是如何工作的?它们之间有什么区别?你应该使用哪一个?这篇文章将会给你想要的答案。
Stable diffusion采样器详解
|
存储 弹性计算 安全
阿里云创业者计划解读,创业者计划主要内容、申请流程及常见问题解答
目前越来越多的初创企业开始意识到云计算在提升业务效率和降低成本方面的重要性。但是对于许多初创企业来说,由于缺乏技术资源和资金,上云之路并不平坦。为了解决这一问题,阿里云推出了创业者计划,旨在为初创企业提供全方位的赋能与服务,助力其在阿里云上快速构建自己的业务,开启智能时代创业新范式。
阿里云创业者计划解读,创业者计划主要内容、申请流程及常见问题解答
|
11月前
|
前端开发 JavaScript Java
一文带你了解和使用js中的Promise
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,正向全栈进发。如果我的文章对你有帮助,请关注我,将持续更新更多优质内容!🎉🎉🎉
528 0
一文带你了解和使用js中的Promise