贪心算法 在每一步中选择当前状态下最好或者最优的选择,从而获取全局最优的算法
贪心算法和动态规划的区别在于 他对每个子问题的解决方案都做出选择,不能回退(选择局部最优),动态规划会保存以前的计算结果,根据以前的结果选择,可以回退(可以回溯选择最优)
例如:最小生成树,哈夫曼编码等等
leetCode 55题
class Solution {
public boolean canJump(int[] nums) {
int pos = nums.length-1;
//从后面往前面贪心
for(int i=pos-1;i>=0;--i)// 从 pos位置的前 N 个位置是否能跳动 pos位置,一个个去试
{
if(nums[i]+i>=pos)// i位置 可以跳到 pos 位置
{
pos = i;//跳到 i 位置 pos -> i (更新位置)
}
}
return pos==0;
}
}
class Solution {
public boolean canJump(int[] nums) {
int l=0,r=0,rightEnd = nums.length-1;
while(l<=r && r<rightEnd)
{
r = Math.max(r,nums[l]+l);
++l;
}
return r>=rightEnd;
}
}
跳跃游戏二:
class Solution {
public int jump(int[] nums) {
if(nums.length==1) return 0;
int reach=0,nextReach=nums[0],step=0;
for(int i=0;i<nums.length;++i)
{
nextReach = Math.max(i+nums[i],nextReach);
if(nextReach>=nums.length-1) return 1+step;
if(reach==i)
{
reach=nextReach;
++step;
}
}
return step ;
}
}