LeetCode:45 跳跃游戏 BFS 解法

LeetCode:45 跳跃游戏 BFS 解法

这种方法比较麻烦

【上一个超时的动态规划法传送门】
【最速贪心解法传送门】
【类似的BFS的题传送门:迷宫】

题目描述

给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。

示例:
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

说明:
假设你总是可以到达数组的最后一个位置。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/jump-game-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

因为每次固定走 1 步,那么直接广度优先搜索,搜索n次搜到终点,就走了n步

  • 借助队列结构,从起点开始广度优先搜索(BFS)
  • 每次将队列头元素x可以访问,并且还未访问的点进队列
  • 从x点出发进行BFS,优先考虑x能够到达的最远点,先把x可达且距x最远的点加入队列,其次是其他近点,降序加入队列

代码

class Solution {
public:
	// 双端队列插入快
    #include ;
    #define push push_back
    #define pop pop_front
    #define top front
    deque<int> q;
    
    int jump(vector<int>& nums)
    {
        int len = nums.size();
        if(len == 1)
        {
            return 0;
        }

		// 初始化访问控制数组
        int* visited = new int[len];
        for(int i=0; i<len; i++)
        {
            visited[i] = 0;
        }
	
		// 起点入队
        q.push(0);
        visited[0] = 1;

		// 设置flag,找到就停
        int flag = 0;
        int cnt = 0;	// 走了多少步
        while(flag == 0)
        {
        	// 对队中所有元素,将他们可达点入队
            int qs = q.size();
            for(int i=0; i<qs; i++)
            {
                int tp = q.top();
                q.pop();
				
				// 优先考虑远的可达点
                for(int j=nums[tp]; j>=1; j--)
                {
                    if(tp+j<=len-1 && visited[tp+j]==0)
                    {
                        visited[tp+j] = 1;
                        q.push(tp+j);
                    }
					
					// 如果可达点有终点,结束BFS
                    if(tp+j == len-1)
                    {
                        flag = 1;
                        break;
                    }
                }

                if(flag == 1)
                {
                    break;
                }
            }
            cnt += 1;
        }

        return cnt;
    }
};

LeetCode:45 跳跃游戏 BFS 解法_第1张图片

你可能感兴趣的:(LeetCode,leetcode,队列,BFS,搜索,bfs)