• 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

    题解地址

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

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

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

  • 相关阅读:
    perf + 火焰图用法 小结
    忽略多年的地理基本知识
    windows7安装docker异常:looks like something went wrong in step ‘looking for vboxmanage.exe’
    我的选择
    CSS3 width的min/max-content、fill-available以及fit-content
    Redis入门与命令汇总
    javascript中的原型详解
    Promise实现及原理
    nodejs中的垃圾回收
    javascript中的闭包
  • 原文地址:https://www.cnblogs.com/canchan/p/12917352.html
Copyright © 2020-2023  润新知