刷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); // 从起始位置开始尝试跳跃
    }
};
相关推荐
魔云连洲9 分钟前
前端树形结构过滤算法
前端·算法
小龙报17 分钟前
《算法通关指南:数据结构和算法篇 --- 顺序表相关算法题》--- 询问学号,寄包柜,合并两个有序数组
c语言·开发语言·数据结构·c++·算法·学习方法·visual studio
小南家的青蛙1 小时前
LeetCode LCR 085 括号生成
算法·leetcode·职场和发展
jackzhuoa1 小时前
Rust 异步核心机制剖析:从 Poll 到状态机的底层演化
服务器·前端·算法
夜晚中的人海1 小时前
【C++】模拟算法习题
c++·算法·哈希算法
花月C1 小时前
算法 - 差分
人工智能·算法·机器学习
拆房老料1 小时前
深入解析提示语言模型校准:从理论算法到任务导向实践
人工智能·算法·语言模型
晨非辰2 小时前
《数据结构风云》递归算法:二叉树遍历的精髓实现
c语言·数据结构·c++·人工智能·算法·leetcode·面试
Dream it possible!2 小时前
LeetCode 面试经典 150_链表_LRU 缓存(66_146_C++_中等)(哈希表 + 双向链表)
c++·leetcode·链表·面试
_dindong4 小时前
牛客101:二叉树
数据结构·c++·笔记·学习·算法