zoukankan      html  css  js  c++  java
  • 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

    题解地址

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

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

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

  • 相关阅读:
    Laya中使用Protobuf
    Laya中第三方库的使用
    Laya的骨骼换装
    Laya的粒子效果
    Laya的预设Prefab (预制件)
    Egret EUI Tab + ViewStack
    Egret 划线手势动画 (切水果)
    Egret3.2.6老项目转成5.2.22微信小游戏,遇到exml加载不了问题
    AndroidUI设计 之 图片浏览器
    Android应用的自动更新模块
  • 原文地址:https://www.cnblogs.com/canchan/p/12917352.html
Copyright © 2011-2022 走看看