LeetCode House Robber

23 篇文章 0 订阅

原题链接在这里:https://leetcode.com/problems/house-robber/

若没有房子,return 0; 若只有一个房子,return nums[0], 也就是这个房子里的钱; 若有两个房子,返回两个房子里钱较多的那个钱。

若是大于两个,因为不能偷邻家,所以新建一个array, 就是res,里面对应的 i 位存能偷到的最多钱的数目, 从前往后每一步都是最优的,就是比较res[i-2]+nums[i] 和 res[i-1].

res[i-2] + nums[i] 是 到i-2家能偷到的最大数加上i家的钱,res[i-1]就是偷到i-1家能偷到的最大钱数,因为若投了i-1家,就不能偷第i家了。


什么时候使用DP:

第一:最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。(这句话可理解为先将复杂的问题简单化,
达到最简后的解题公式同样可以解复杂情况。比如这里说给出多个房子,那我们就从没有房子和有1个、2个房子的情况入手,找到一个规律)
第二:无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。(也就是说每一个
子问题的解有一个状态,且固定不会变化,比如这道题中有3个房子,我选了第一个房子,这是一个状态,我选择第三个房子,这是第二个状态,但第二个状态不会改变第一个状态)


AC Java:

public class Solution {
    public int rob(int[] nums) {
        if(nums == null || nums.length == 0){
            return 0;
        }
        if(nums.length == 1){
            return nums[0];
        }
        if(nums.length == 2){
            return Math.max(nums[0],nums[1]);
        }
        int [] res = new int[nums.length];
        res[0] = nums[0];
        res[1] = Math.max(nums[0],nums[1]);
        for(int i = 2; i < nums.length; i++){
            res[i] = Math.max(res[i-2]+nums[i], res[i-1]);
        }
        return res[nums.length-1];
    }
}

进阶题目是House Robber II.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值