刷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); // 从起始位置开始尝试跳跃
    }
};
相关推荐
liulilittle2 小时前
IP校验和算法:从网络协议到SIMD深度优化
网络·c++·网络协议·tcp/ip·算法·ip·通信
bkspiderx3 小时前
C++经典的数据结构与算法之经典算法思想:贪心算法(Greedy)
数据结构·c++·算法·贪心算法
中华小当家呐4 小时前
算法之常见八大排序
数据结构·算法·排序算法
沐怡旸5 小时前
【算法--链表】114.二叉树展开为链表--通俗讲解
算法·面试
一只懒洋洋5 小时前
K-meas 聚类、KNN算法、决策树、随机森林
算法·决策树·聚类
方案开发PCBA抄板芯片解密6 小时前
什么是算法:高效解决问题的逻辑框架
算法
songx_997 小时前
leetcode9(跳跃游戏)
数据结构·算法·游戏
小白狮ww7 小时前
RStudio 教程:以抑郁量表测评数据分析为例
人工智能·算法·机器学习
AAA修煤气灶刘哥7 小时前
接口又被冲崩了?Sentinel 这 4 种限流算法,帮你守住后端『流量安全阀』
后端·算法·spring cloud
kk”8 小时前
C语言快速排序
数据结构·算法·排序算法