leetcode198. 打家劫舍,一种不一样的思路

  1. 打家劫舍

看其他人的题解都是到一家,然后通过判断是否打劫该家来得到最优解,而我的思路有些许不同。
我是从后往前想的,到了某一家,我一定要打劫他,那么我就不能打劫它的前一家(i-1)。但是我不确定是打劫他的前面第二家(i-2)还是打劫他的前面第三家(i-3)的金额更高。所以可以在这里进行判断,得到我一定要打劫的这家可以获得的最高金额,然后再拿此金额和之前的最高金额max对比,如果此家的金额高于之前的最高金额max,则更新max,最终返回max


```java
class Solution {
    public int rob(int[] nums) {
        //f[i]=max(f[i-2]+nums[i],f[i-3]+nums[i])
        int length=nums.length;
        if(length==1) return nums[0];
        if(length==2) return Math.max(nums[0],nums[1]);
        int[] f=new int[length];
        f[0]=nums[0];
        f[1]=nums[1];
        f[2]=f[0]+nums[2];
        int max=Math.max(f[1],f[2]);
        for(int i=3;i

后来又写了一次这道题,尝试着使用判断是否打劫当前住户来选择最优解,发现和自己之前的的思路还是有出入的。之前其实不用很在乎f数组中存的的值的意义,因为有着max变量在帮我们维护着最终的结果。而这次少了max变量,就需要知道f数组中存的值的意义是前i户中所能得到的最大值。所以即使在给f[1]数组赋值时也不能单纯赋给nums[1]的值,而是需要取在i个住户中打劫所能得到的最大金额。





```java
class Solution {
    public int rob(int[] nums) {
        int len=nums.length;
        if(len==1) return nums[0];
        int[] f=new int[len+1];
        f[0]=nums[0];
        f[1]=nums[1];
        f[1]=Math.max(f[0],f[1]);
        for(int i=2;i

你可能感兴趣的:(leetcode,算法,动态规划)