1.跳跃游戏
方法一:动态规划
class Solution
{
public:
bool canJump(vector<int>& nums)
{
vector<bool>dp(10010,false);
int n=nums.size();
dp[0]=true;
for(int i=0; i<n; i++)
{
if(!dp[i])//不可到达
{
continue;
}
int max1=min(i+nums[i],n-1);//限制能够跳到的最远位置n-1
for (int j = i + 1; j <= max1; j++)
{
dp[j] = true; // 更新所有可以到达的位置为 true
}
}
return dp[n-1];
}
};
方法二:贪心优化
class Solution
{
public:
bool canJump(vector<int>& nums)
{
int maxReach = 0; // 初始化能够到达的最远位置为 0
int n = nums.size();
for (int i = 0; i < n; i++)
{
if (i > maxReach)
{
return false; // 如果当前下标 i 超过了 maxReach,无法到达
}
maxReach = max(maxReach, i + nums[i]); // 更新最远可达位置
if (maxReach >= n - 1)
{
return true; // 如果 maxReach 已经到达或超过最后一个下标,返回 true
}
}
return false; // 如果遍历完仍然没有达到最后一个下标,返回 false
}
};
2.跳跃游戏Ⅱ
题目链接:45. 跳跃游戏 II - 力扣(LeetCode)
方法一:动态规划
class Solution {
public:
int jump(vector<int>& nums) {
int dp[10010];//到位置i的最小跳跃次数
int n=nums.size();
fill(dp,dp+n,10010);
dp[0]=0;
for(int i=0;i<n;i++)
{
for(int j=1;i+j<n && j<=nums[i];j++)//计算每个位置的最小跳跃次数
{
dp[i+j]=min(dp[i+j],dp[i]+1);//位置i+j的最小跳跃次数:
//第一种情况,dp[i]为上一步最小跳跃次数,dp[i]+1到达位置i+j
//第二种情况,其他方式dp[i+j]为最优到达位置i+j最小跳跃次数
}
}
return dp[n-1];
}
};
方法二:贪心优化
class Solution {
public:
int jump(vector<int>& nums) {
//思路:记录当前能跳跃的最远位置,更新边界重复跳跃
int max1=0,end=0;
int n=nums.size();
if(n==1)
{
return 0;
}
int step=0;//跳跃步数
for(int i=0;i<n;i++)
{
max1=max(max1,nums[i]+i);//当前跳跃最远位置
if(end==i)//更新边界
{
step++;
end=max1;
if(end>=n-1)
{
break;
}
}
}
return step;
}
};