LeetCode:45. Jump Game II

在这里插入图片描述

最近看到bfs就从终点开始考虑,这一题却是从开头考虑的:(

class Solution {
public:
    int jump(vector<int>& nums) {
        if (nums.size() < 2)
            return 0;
        queue<int> q;
        q.push(0);
        int level = 0;
        int sz = nums.size();
        while (!q.empty()) {
            ++level;
            int qsz = q.size();
            int maxIdx = -1;
            int maxNextIdx = -1;
            while (qsz-- > 0) {
                int idx = q.front();
                q.pop();
                if (idx + nums[idx] >= sz-1) {
                    return level;
                }
                maxIdx = max(maxIdx, idx);//不是每弹出一个queue里面的就把它范围内的压进去,那样会压进去很多重复的。算出最大范围是多少,一次性压
                maxNextIdx = max(maxNextIdx, idx+nums[idx]);
            }
            for (int j = maxIdx+1; j <= maxNextIdx; ++j)
                q.push(j);
        }
        return -1;
    }
};
//bfs不仅要从终点考虑,也需要从起点考虑

下面是用贪心,应该是最优:

class Solution {
public:
    int jump(vector<int>& nums) {
        if (nums.size() < 2)
            return 0;
        int curBeg = 0, curEnd = 0;
        int maxReach = -1;
        int level = 1;
        for (int i = 0; i < nums.size(); ++i) {
            if (i > curEnd) {
                curBeg = i;
                curEnd = maxReach;
                ++level;
            }
            maxReach = max(maxReach, nums[i] + i);
            if (maxReach >= nums.size()-1)
                return level;
        }
        return -1;
    }
};

其实道理都差不多,不过观察到bfs里面每层迭代我们关心的其实是最远的那个,这里直接就暴露出来了。以后遇到类似的bfs可以想到贪心

posted @ 2019-09-12 11:49  于老师的父亲王老爷子  阅读(17)  评论(0)    收藏  举报