LeetCode-Jump Game II-跳跃游戏-BFS
https://oj.leetcode.com/problems/jump-game-ii/
这道题要是直接DP就跪了。将其当成一个图论问题,则每个i节点到其随后的A[i]个节点都有一条边。BFS搜索并标记能够避免计算后面又到达的一些顶点因而是O(n)的算法。
BFS还需要针对性的少于优化,首先扩展新结点要从后向前,并且在n-1作为新节点产生时立即返回答案才能AC全部case。
const int INF=9999; class Solution { public: vector <int> d; int jump(int A[], int n) { if (n<=1) return 0; d.resize(n,INF); d[0]=0; queue <int> que; que.push(0); while(!que.empty()){ int t=que.front(); que.pop(); for (int i=min(t+A[t],n-1);i>t;i--){ if (d[i]==INF){ d[i]=d[t]+1; if (i==n-1) return d[n-1]; que.push(i); } } } return d[n-1]; } };