[leetcode] LCP 09. 最小跳跃次数(搜索、bfs)

题目描述

在这里插入图片描述题目链接:https://leetcode-cn.com/problems/zui-xiao-tiao-yue-ci-shu/

解题思路:

  • 直接用bfs模拟跳跃的过程并适当优化即可。
  • 在bfs的过程中,每到一个位置,就把下一步能到的所有位置加入队列,直到跳到大于等于N的位置。
  • 优化:(1)对于坐标i,如果i已经被跳过的话,则没有必要再跳一次——因为再跳一次所经历的步数一定更多。所以不用再将i重复加入队列。(2)每次到达新的位置i,都要判断一遍[0,i-1]是否已经被跳过,这个枚举会造成很大的时间复杂度。在某一次跳到j位置时,我们会将[0,j-1]的位置全部“回跳”,所以下一次处于位置i时,只需检查[j,i-1]是否被跳过。也就是说只需要每一次记录一下这个"最大的j"(记为low)。每一次考虑“下一个坐标”的时候只需要从low往后判断即可 。
  • 这题可以类比方格上走迷宫的题。

AC代码

//Java代码
//Node表示某一"位置","位置"的属性有:跳跃的次数step、当前坐标position、以及下一步能往右跳所能到达的坐标。
//此处所说的坐标是数组下标
class Node{
    
    
  int step;    //跳跃次数
  int position;  //所在坐标
  int next;     //从当前坐标往后跳可以到达的坐标
  //next可以用来判断下一个位置是否超过N,以简化代码
  public Node(int s,int p,int n){
    
    
  this.step=s;
  this.position=p;
  this.next=n;    
  }
}
class Solution {
    
    
    public int minJump(int[] jump) {
    
    
    int N=jump.length; 
    int vis[]=new int[N];  //vis[i]等于1表示坐标i已经被跳到过
    Queue<Node>queue=new LinkedList<>(); //存储“位置”的队列
    int  s=0,p=0,n=jump[0],low=1;
    queue.offer(new Node(s,p,n));   //起点加入队列
    vis[0]=1;
    while(!queue.isEmpty()){
    
    
    Node now=queue.remove();
     s=now.step;
     p=now.position;
     n=now.next;
    if(n>=N)  return s+1;   //到达大于N的位置时直接返回步数
    //将所有能到达且还没有“跳到过”的位置加入队列
    else{
    
    
    for(int j=low;j<p;j++)    
    if(vis[j]==0){
    
    
    queue.offer(new Node(s+1,j,j+jump[j]));
    vis[j]=1;  
    } 
    if(vis[n]==0){
    
    
    queue.offer(new Node(s+1,n,n+jump[n]));
    vis[n]=1;    
    }   
    }
    low=Math.max(low,p);    //更新
    }
    return s;
    }
}

JAVA队列总结:

第一次用java队列,总结一下几个常用方法:

add()
将指定的元素插入此队列(如果立即可行且不会违反容量限制),在成功时返回 true,如果当前没有可用的空间,则抛出 IllegalStateException。

element()
获取,但是不移除此队列的头。

offer()
将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,此方法通常要优于 add(),后者可能无法插入元素,而只是抛出一个异常。

peek()
获取但不移除此队列的头;如果此队列为空,则返回 null。

poll()
获取并移除此队列的头,如果此队列为空,则返回 null。

remove()
获取并移除此队列的头。

队列的声明:
Queue<元素类型>queue=new LinkedList<>();

上一篇博客:【洛谷】P1182 数列分段 Section II(二分答案)

猜你喜欢

转载自blog.csdn.net/IAMLSL/article/details/114489798