给你一个非负整数数组 nums
,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true
;否则,返回 false
。
引言
今天我们来讨论 LeetCode 上的一道经典题目:55. 跳跃游戏。这道题是贪心算法的典型应用,通过它我们可以学习如何高效地解决数组遍历和动态规划类问题。
解题思路
这道题的核心思想是 贪心算法。我们通过维护一个变量 k
,表示当前能到达的最远位置。在遍历数组时,不断更新 k
,并检查是否能到达终点。
-
初始化:
k = 0
,表示当前能到达的最远位置。 -
遍历数组:
-
如果当前位置
i
超过了k
,说明无法到达当前位置,直接返回false
。 -
否则,更新
k
为max(k, i + nums[i])
,即当前位置能跳到的最远位置。
-
-
返回结果:如果遍历完数组都没有遇到
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;// 如果遍历完数组,说明可以到达终点 } };
代码解析
-
变量
k
:表示当前能到达的最远位置,初始值为0
。 -
遍历数组:
-
如果
i > k
,说明无法到达当前位置,直接返回false
。 -
否则,更新
k
为max(k, i + nums[i])
。
-
-
返回结果:如果遍历完数组都没有返回
false
,说明可以到达终点,返回true
。 -
时间复杂度:
O(n)
,只需遍历一次数组。 -
空间复杂度:
O(1)
,只使用了常数级别的额外空间。总结
这道题通过贪心算法高效地解决了跳跃游戏问题,代码简洁且性能优异。贪心算法的核心思想是 每一步都选择当前最优解,从而希望最终结果是全局最优解。
如果你对贪心算法感兴趣,可以尝试解决类似的题目,例如:
-
参考
-
作者:Ikaruga
链接:55. 跳跃游戏 - 力扣(LeetCode) -
希望这篇博客对你有所帮助!如果有任何问题或建议,欢迎在评论区留言讨论。😊