/*
贪心算法
jump game
给出一列数组,非负,数组每个元素表示可以跳跃的最大步数
第一个元素是初始化位置,编写一个函数判断是否成立(跳出数组)
分析:
对于数组A,共有n层,每次最多可以跳A[i]步,我们可以这样分析,
加入从第0层开始,一层一层的往上跳,每次可以跳1步,那么
对于跳到第i层时,距离0层的最远距离就是i-1+1+A[i-1]
此时我们需要判断的就是这个最远距离是否大于n
jump game II
对于这个问题大体和I类型相似,不过本题是这样要求的,
从第0层开始跳跃,返回跳到最后的最小步数
例如[2 3 1 1 4]
返回 2
*/
#include<iostream>
using namespace std;
class Solution
{
public:
//jump game
bool jumpgame(int A[], int n)
{
int reach = 1;//reach表示向右到达的最远距离
for (int i = 0; i < reach&&reach < n; i++)
{
reach = max(reach, i + 1 + A[i]);
}
return reach >= n;
}
int max(int a, int b)
{
return a>b ? a : b;
}
//jump game II
int jumpgameII(int A[], int n)
{
int countstep = 0;//计数
int lastdis = 0;//表示到达的最远距离
int curdis = 0;//表示使用A[i]+i到达的最远距离
for (int i = 0; i < n; i++)//一层一层的跳跃
{
if (i>lastdis)//最远距离小于一步一步跳的节奏
{
countstep++;//此时才计数
lastdis = curdis;
}
curdis = max(curdis, A[i] + i);//比较A[i]+i和reach到达的最远步数
}
return countstep;
}
};
int main()
{
Solution s1;
int a[] = { 2, 3, 1, 1, 4 };
cout << s1.jumpgame(a, 5) << endl;
//jump game II
cout << "输出最小步数:";
cout << s1.jumpgameII(a, 5) << endl;
system("pause");
return 0;
}
jump game I // II
最新推荐文章于 2022-05-23 16:00:10 发布