leetcode [House Robber]

本文介绍了一种解决房屋抢劫问题的高效算法。该算法利用动态规划思想,通过维护两个变量来跟踪相邻房屋被盗与未被盗状态下的最大收益,从而得出最终的最大抢劫金额。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class Solution {
	/*
	 可以看到下面的解法,正确的解法逻辑是很清晰的,最先想解这题的时候想到每四个房子分为一组,
	 分别为1+3,2+4,1+4的组合,然后去更新,但是逻辑很不清晰
	 
         下面的正确解法中用prevNo,prevYes来模拟了偷盗当前房子可能的情况
	 */
    public int rob(int[] nums) {
    	int res = 0;
        int prevNo = 0;//用来记录当前房子的左侧邻居没有被偷盗时的盗取总额
        int prevYes = 0;//用来记录当前房子的左侧邻居被偷盗时的盗取总额
        //采用动态规划,确保到任意房子i时的盗取总额是最大的,后面的房子以前面的为基础,这就是动态规划的主要思想
        for(int i = 0; i < nums.length; i++){
        	//不能通过if(preYes > preNo)这个条件来判断当前房子i的左侧邻居是否被偷盗
        	int temp = prevNo + nums[i];//用temp来保存若当前房子i的左侧邻居没有被偷盗时,金额发生的变化
        	//由于当前房子i在可盗取(左侧邻居没有被盗取)时,不一定非要被盗取
        	//当前房子之后也有两种选择
        	//更新prevNo(当前房子没有被盗取)
        	prevNo = Math.max(prevYes, prevNo);
        	//更新prevYes(当前房子被盗取)
        	prevYes = temp;//隐含了左侧邻居没有被盗取的情况,因为nums[i]加的是prevNo
        	
        	res = Math.max(prevYes, prevNo);//确保到任意房子i时的盗取总额是最大的,这一句其实没什么意义
        }
        return res;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值