1.动态规划与贪心算法的区别与联系
- 1.联系
- 都是一种推导算法
- 都是分解成子问题来求解,都需要具有最优子结构
- 2.区别
*1. 贪心:每一步的最优解一定包含上一步的最优解,上一步之前的最优解则不作保留。动态规划:全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有的局部最优解
- 2.贪心:如果把所有的子问题看成一棵树的话,贪心从根出发,每次向下遍历最优子树即可(通常这个“最优”都是基于当前情况下显而易见的“最优”);这样的话,就不需要知道一个节点的所有子树情况,于是构不成一棵完整的树。动态规划:动态规划则自底向上,从叶子向根,构造子问题的解,对每一个子树的根,求出下面每一个叶子的值,最后得到一棵完整的树,并且最终选择其中的最优值作为自身的值,得到答案
- 3.根据以上两条可以知道,贪心不能保证求得的最后解是最佳的,一般复杂度低;而动态规划本质是穷举法,可以保证结果是最佳的,复杂度高。
- 4.代码对比
class Solution {
public int nearestValidPoint(int x, int y, int[][] points) {
int lab=-1;
int MinDistance=2147483647;
for(int i=0;i<points.length;i++){
if(points[i][0]==x||points[i][1]==y){
if(MinDistance>(Math.abs(x-points[i][0])+Math.abs(y-points[i][1])))
{
MinDistance=(Math.abs(x-points[i][0])+Math.abs(y-points[i][1]));
lab=i;
}
}
}
return lab;
}
}
class Solution {
public int rob(int[] nums) {
int n=nums.length-1;
if(n==0)
return nums[0];
if(n==1)
return Math.max(nums[0],nums[1]);
int MaxMonwy[][] = new int[n+1][2];
int MAX=0;
MaxMonwy[0][0]=0;
MaxMonwy[0][1]=nums[0];
MaxMonwy[1][0]=nums[0];
MaxMonwy[1][1]=nums[1];
for(int i=2;i<=n-1;i++){
MaxMonwy[i][0]=Math.max(MaxMonwy[i-1][0],MaxMonwy[i-1][1]);
MaxMonwy[i][1]=Math.max(MaxMonwy[i-2][0],MaxMonwy[i-2][1])+nums[i];
}
int t;
t=(MaxMonwy[n-1][0]>MaxMonwy[n-1][1]?MaxMonwy[n-1][0]:MaxMonwy[n-1][1]);
MAX=MAX>t?MAX:t;
MaxMonwy[1][0]=0;
MaxMonwy[1][1]=nums[1];
MaxMonwy[2][0]=nums[1];
MaxMonwy[2][1]=nums[2];
for(int i=3;i<=n;i++){
MaxMonwy[i][0]=Math.max(MaxMonwy[i-1][0],MaxMonwy[i-1][1]);
MaxMonwy[i][1]=Math.max(MaxMonwy[i-2][0],MaxMonwy[i-2][1])+nums[i];
}
t=MaxMonwy[n][0]>MaxMonwy[n][1]?MaxMonwy[n][0]:MaxMonwy[n][1];
MAX=MAX>t?MAX:t;
return MAX;
}
}
2.递归
- 分治
- 回溯
可参考文章