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

    题解地址

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

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

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

  • 相关阅读:
    我的Vue朝圣之路2
    我的Vue朝圣之路1
    1.Rabbitmq学习记录《本质介绍,协议AMQP分析》
    IdentityServer4(客户端授权模式)
    windows10环境下的RabbitMQ使用_笔记
    windows10环境下的RabbitMQ安装_笔记
    asp.net Code CSRedis学习记录
    visual studio code 命令行创建发布一个项目
    RabbitMQ学习记录1
    AspNetCore Redis实现分布式缓存
  • 原文地址:https://www.cnblogs.com/canchan/p/12917352.html
Copyright © 2011-2022 走看看