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;
}
}
leetcode [House Robber]
最新推荐文章于 2022-04-10 15:21:15 发布