刷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); // 从起始位置开始尝试跳跃
    }
};
相关推荐
你怎么知道我是队长几秒前
C语言---排序算法1---冒泡排序法
c语言·算法·排序算法
qq_537562672 分钟前
C++与Java性能对比
开发语言·c++·算法
忆锦紫2 分钟前
图像锐化算法:Robert/Sobel/Laplacian锐化算法及MATLAB实现
图像处理·算法·计算机视觉·matlab
m0_686041612 分钟前
C++中的策略模式应用
开发语言·c++·算法
沉默-_-3 分钟前
力扣hot100普通数组(1)--C++
java·数据结构·算法·leetcode·数组
wasp5208 分钟前
拒绝 OOM:Apache Fesod 高性能 Excel 处理架构全景解析
算法·架构·apache·excel
爱吃生蚝的于勒9 分钟前
【Linux】进程信号的保存(二)
linux·运维·服务器·c语言·数据结构·c++·算法
diediedei12 分钟前
C++构建缓存加速
开发语言·c++·算法
油泼辣子多加14 分钟前
【信创】华为昇腾大模型部署
人工智能·算法·机器学习·华为
春日见15 分钟前
C++单例模式 (Singleton Pattern)
java·运维·开发语言·驱动开发·算法·docker·单例模式