刷leetcode hot100--3贪心(30min,看思路)

55. 跳跃游戏 - 力扣(LeetCode)

贪心局部的最优,和股票一样,维护一个最什么的值

从i=0到cover去维护就很妙,因为这样可以全覆盖【不是仅仅从一个点跳到一个点】,而且避免了回溯的尴尬。

复制代码
class Solution {
public:
    bool canJump(vector<int>& nums) {
        int cover = 0;//覆盖max范围
        for(int i = 0;i<=cover;i++){
            cover = max(nums[i]+i,cover);
            if(cover>=nums.size()-1){//要在for内判断,而不是for外
                return true;
            }
        }
        return false;
    }
};

动态规划

复制代码
class Solution {
public:
    bool canJump(vector<int>& nums) {
        int n = nums.size();
        vector<bool> dp(n, false); // dp[i]表示从位置i可以到达最后一个位置
        dp[n - 1] = true;          // 最后一个位置自然是可以到达的

        // 从倒数第二个位置开始,逐步判断每个位置
        for (int i = n - 2; i >= 0; i--) {
            // 检查当前位置能跳到的最远位置,如果可以到达最后一个位置,就设置dp[i]为true
            int farthest = i + nums[i];
            for (int j = i + 1; j <= min(farthest, n - 1); j++) {
                if (dp[j]) {
                    dp[i] = true;
                    break; // 如果能通过当前位置跳跃到后面的一个位置就可以到达最后一个位置,直接跳出循环
                }
            }
        }

        return dp[0]; // 如果从位置0可以到达最后一个位置,返回true
    }
};

回溯

复制代码
class Solution {
public : 
    bool canJumpFromPosition(int position, vector<int>& nums,
                                      vector<bool>& visited) {
        int n = nums.size();

        // 如果当前位置已经访问过了,说明已经尝试过此路径,避免重复计算
        if (visited[position]) {
            return false;
        }

        // 标记当前位置为已访问
        visited[position] = true;

        // 如果已经到达最后一个位置,返回true
        if (position == n - 1) {
            return true;
        }

        // 尝试从当前位置跳跃到其他位置
        int farthestJump =
            min(position + nums[position], n - 1); // 最远可以跳跃的位置
        for (int nextPosition = position + 1; nextPosition <= farthestJump;
             nextPosition++) {
            if (canJumpFromPosition(nextPosition, nums, visited)) {
                return true; // 如果从某个跳跃位置能够到达最后一个位置,返回true
            }
        }

        return false; // 如果所有的跳跃都无法到达最后一个位置,返回false
    }

    bool canJump(vector<int>& nums) {
        int n = nums.size();
        vector<bool> visited(n, false); // 记录每个位置是否已经被访问过
        return canJumpFromPosition(0, nums, visited); // 从起始位置开始尝试跳跃
    }
};
相关推荐
想跑步的小弱鸡5 小时前
Leetcode hot 100(day 3)
算法·leetcode·职场和发展
xyliiiiiL6 小时前
ZGC初步了解
java·jvm·算法
爱的叹息7 小时前
RedisTemplate 的 6 个可配置序列化器属性对比
算法·哈希算法
独好紫罗兰7 小时前
洛谷题单2-P5713 【深基3.例5】洛谷团队系统-python-流程图重构
开发语言·python·算法
每次的天空8 小时前
Android学习总结之算法篇四(字符串)
android·学习·算法
请来次降维打击!!!8 小时前
优选算法系列(5.位运算)
java·前端·c++·算法
qystca8 小时前
蓝桥云客 刷题统计
算法·模拟
别NULL9 小时前
机试题——统计最少媒体包发送源个数
c++·算法·媒体
weisian1519 小时前
Java常用工具算法-3--加密算法2--非对称加密算法(RSA常用,ECC,DSA)
java·开发语言·算法
程序员黄同学10 小时前
贪心算法,其优缺点是什么?
算法·贪心算法