LC45 跳跃游戏

这题我是用queue写的BFS,超时了。

如果在每一层倒序遍历的话,有一个样例过不了,比答案多了1,如果用正序会超时。

我想正序遍历肯定不对,因为按照贪心的想法不对。倒序遍历,虽然是按照贪心思想,但是有可能前面的结果反而比后面的优,这种情况没办法处理。所以直接BFS不行。

因为这个含有单调性,每一个位置都可以从前面位置过来,当前的位置的最小值可以影响后面位置的最小值。可以使用单调队列优化成O(N)。

 

后来看了题解,其实很多时候,只想着用BFS实现什么的,但其实可以不拘泥于形式。不是所有BFS都需要queue,有可能表面看起来是数组,但其实用的BFS思想,是根据单调性优化的BFS。

因为BFS是将所有路径都遍历了一遍,其实不需要管这些路径,只要得到之前每个位置的结果就可以得到当前位置的结果。BFS貌似和动态规划也有联系。

所以按这个原理,确实只用遍历每个位置就可以得到答案。

class Solution {
public:
    int jump(vector<int>& nums) {
        int N = nums.size();
        vector<int> dp(N, 0);
        for(int i = 1, last = 0; i < N; i++) {
            while(last < N && last+nums[last] < i) last++;
            dp[i] = dp[last]+1;
        }
        return dp[N-1];
    }
};
View Code

题解地址

 

如果遇到了其他的单调关系,这个做法不一定可以。因为这个顺序不能保证一定单调。

用单调队列根据具体情况处理才是通解。

 

 

 官方题解这么说的,很有道理。我没有考虑到这一点。

 

posted @ 2020-08-03 16:37  参婵  阅读(119)  评论(0编辑  收藏  举报