三道LeetCode理解贪心和DP

贪心:例子为55题:JUMP GAME  题意:这样一个非负的数组,每一个元素代表此时能跳多远,看是否能到达最后一个位置。解决思路:从第一步开始计算可以前进的最大步长,每走一步比较更新该值,始终保持当前位置的时候可前进步长最大。到达最终位置前,若出现步长<= 0的情况,说明失败。即每个阶段的最优状态都是由上一个阶段的最优状态得到的。

代码:

class Solution {
    public boolean canJump(int[] nums) {
        int max = 0;
        for (int i = 0; i < nums.length; i++) {
            if (i > max) return false;
            max = Math.max(nums[i] + i, max);
        }
        return true;
    }
}
DP:例子为62题:Unique Paths 题意:从一个棋盘中左上端到右下端,只能向右或者向下走一共有多少钟走法。解决思路:很典型的DP问题, 每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到而不管之前这个状态是如何得到的。所以这道题就是说当前位置由上一个阶段的两种状态得到(因为只能向右或者向下走),即
matrix[i][j] = matrix[i][j-1] + matrix[i-1][j];
总的代码如下:
class Solution {
    public  int uniquePaths(int m, int n) {
        int[][] matrix = new int[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if(i == 0 || j == 0) matrix[i][j] = 1;
                else matrix[i][j] = matrix[i][j-1] + matrix[i-1][j];
            }
        }
        return matrix[m-1][n-1];
    }
}

贪心+DP:例子为53题,题意为找出一个数组中某一段累加和最大。解题思路:考虑怎么得到和最大的子数组,就是在循环之中(遍历每个阶段,这里每个阶段的状态就是是否从这个元素开始计算子数组),确定每一个阶段的最优状态,这个过程通过与上一个阶段的最优状态相比,即贪心;而最优状态的求解是也是DP过程,即每一个阶段确定是否从当前状态开始进行最大子数组的计算,通过与之前某一个阶段的状态进行比较(例如第一个状态是-2选中,然后后面有一个状态是否选4,二者比较来确定是否选择) 

代码如下:

class Solution {
    public int maxSubArray(int[] nums) {
        int result = nums[0], sum = nums[0];
        for (int i = 1; i < nums.length; i++){
            sum = Math.max(sum + nums[i], nums[i]);//决定是当前位置(nums[i])还是累加值(sum + nums[i]),即不停的寻找最大的新值,方法是如果前面的累加还不如新出现的值大,那肯定选择新出现的值;如果累加的大那就继续累加。即求最优状态
            result = Math.max(result, sum);//决定目前的最大值(sum)还是之前的最大值(result),即我累加但不一定有以前的好,因为有可能加了一个负的数,那要有一个保存之前最大值的数。这一步是一个贪心过程,每一次只与上一个阶段的最优状态比较得到当前阶段的最优状态。
        }
        return result;
    }
}

与Jump Game相比可看出贪心一般在一句代码中会以本身出现两次,这是因为它只与上一个阶段进行比较(result出现两次,Jump中max出现两次)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值