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];
    }
};

  

posted @ 2014-10-10 01:18  zombies  阅读(280)  评论(0编辑  收藏  举报