☰
55. 跳跃游戏(坐标dp)
2026/10/13 14:20:40 网站建设 项目流程

链接:https://leetcode-cn.com/problems/jump-game/

题解:https://leetcode-cn.com/problems/jump-game/solution/

我们可以用贪心的方法解决这个问题。

设想一下,对于数组中的任意一个位置 y,我们如何判断它是否可以到达?根据题目的描述,只要存在一个位置 x,它本身可以到达,并且它跳跃的最大长度为 x+nums[x],这个值大于等于 y,即x+nums[x]≥y,那么位置 y 也可以到达。

换句话说,对于每一个可以到达的位置 x,它使得 [x]x+1,x+2,⋯,x+nums[x] 这些连续的位置都可以到达。

这样以来,我们依次遍历数组中的每一个位置,并实时维护 最远可以到达的位置。对于当前遍历到的位置 x,如果它在 最远可以到达的位置 的范围内,那么我们就可以从起点通过若干次跳跃到达该位置,因此我们可以用 x+nums[x] 更新 最远可以到达的位置。

复杂度分析

时间复杂度:O(n),其中 n 为数组的大小。只需要访问 nums 数组一遍,共 n 个位置。

空间复杂度:O(1),不需要额外的空间开销。

class Solution { public: bool canJump(vector<int>& nums) { if(nums.size() == 0) { return true; } // 最远能到达的下表位置 int max_arrived = 0; for(int i = 0; i < nums.size(); ++i) { // 判断最远到达的下标,是否已经超过当前index // 能到达当前index if(max_arrived >= i) { // 更新最远到达的下标位置 max_arrived = max(max_arrived, i+nums[i]); } else { // 如果最远的位置,到达不了当前的index,直接返回false return false; } } // 可以到达>=nums.size()-1的下标 return true; //return max_arrived >= nums.size()-1? true:false; } };
class Solution { public: bool canJump(vector<int>& nums) { if (nums.size() <= 0) { return false; } int len = nums.size(); std::vector<int> dp(len, false); dp[0] = true; for (int i = 0; i < len; ++i) { for (int j = 0 ; j < i; ++j) { if (dp[j] && j + nums[j] >= i) { dp[i] = true; } if (dp[i]) { break; } } } return dp[len-1]; } };

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询