55. 跳跃游戏

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。

引言

今天我们来讨论 LeetCode 上的一道经典题目:55. 跳跃游戏。这道题是贪心算法的典型应用,通过它我们可以学习如何高效地解决数组遍历和动态规划类问题。

解题思路

这道题的核心思想是 贪心算法。我们通过维护一个变量 k,表示当前能到达的最远位置。在遍历数组时,不断更新 k,并检查是否能到达终点。

  1. 初始化k = 0,表示当前能到达的最远位置。

  2. 遍历数组

    • 如果当前位置 i 超过了 k,说明无法到达当前位置,直接返回 false

    • 否则,更新 k 为 max(k, i + nums[i]),即当前位置能跳到的最远位置。

  3. 返回结果:如果遍历完数组都没有遇到 i > k 的情况,说明可以到达终点,返回 true

    class Solution {
    public:
        bool canJump(vector<int>& nums) {
            int k=0;// k 表示当前能到达的最远位置
            for(int i=0;i<nums.size();i++){
                if(i>k) return false;// 如果当前位置超过了能到达的最远位置,返回 false
                k=max(k,i+nums[i]);// 更新能到达的最远位置
            }
            return true;// 如果遍历完数组,说明可以到达终点
        }
    };
    代码解析
  4. 变量 k:表示当前能到达的最远位置,初始值为 0

  5. 遍历数组

    • 如果 i > k,说明无法到达当前位置,直接返回 false

    • 否则,更新 k 为 max(k, i + nums[i])

  6. 返回结果:如果遍历完数组都没有返回 false,说明可以到达终点,返回 true

  7. 时间复杂度O(n),只需遍历一次数组。

  8. 空间复杂度O(1),只使用了常数级别的额外空间。

    总结

    这道题通过贪心算法高效地解决了跳跃游戏问题,代码简洁且性能优异。贪心算法的核心思想是 每一步都选择当前最优解,从而希望最终结果是全局最优解。

    如果你对贪心算法感兴趣,可以尝试解决类似的题目,例如:

  9. 45. 跳跃游戏 II

  10. 134. 加油站

    参考
  11. LeetCode 55. 跳跃游戏

  12. 作者:Ikaruga
    链接:55. 跳跃游戏 - 力扣(LeetCode)

  13. 希望这篇博客对你有所帮助!如果有任何问题或建议,欢迎在评论区留言讨论。😊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值