好久没有复习贪心算法了,借着这个题目回顾一下。实际应用中用到贪心算法的地方很多,最小生成树算法、哈夫曼树的构造迪杰特斯拉算法都是贪心算法。贪心算法的思路简单来说,就是每次都找到当下的最优解,把一个大问题划分成一个个子问题。拿jump Game来说,当处于位置i的时候,下一步跳跃的步数可以重新选择跳跃的步数,选择的范围是0~A[i],或者继续走上一次决定的步数,也就是往前走一步
class Solution {
public:
bool canJump(int A[], int n) {
//贪心算法就是每次取得每一步的最优解
if(n==0)
return false;
if(n==1)
return true;
int step=A[0];//最初选取的是A[0]的值(最大步数,最优解)
int i;
for(i=1;i<n;i++)
{
if(step>0)
{
step--;//到达下一个结点,step减1
step=max(step,A[i]);//此时可以对比A[i]选取最大的步数,如果选择的是A[i]则step的值就表示上一次应跳过的步数
}
else//如果step<0说明无法走到终点
return false;
}
return true;
}
};