文章目录 题目描述思路 & 代码更新版 题目描述 好家伙,真是一道不符合社会主义价值观的题目不过我们还是要把这道题做了,而且还得用上动态规划 思路 & 代码 首先,不能打劫相邻然后,房屋都是非负整数(讲道理,之后不会出个带负数的版本把。。老恶心人了)开始做吧,用dp直接冲: 因为dp需要初始化前三个数,因此把这三个数作为特殊情况先判断然后,考虑到第n个值,肯定在第n-2和第n-3个值之间取:第n-1不能取,第n-4还不如直接取n-2,以此类推。更多信息见注释 class Solution { public int rob(int[] nums) { int len = nums.length; // 三种特殊情况 if(len == 0){ return 0; } if(len == 1){ return nums[0]; } if(len == 2){ return Math.max(nums[1],nums[0]); } // dp[i]:以偷nums[i]结尾的情况,能得到的最大钱数 int[] dp = new int[len]; // dp的初始化,这三个值是固定的。 dp[0] = nums[0]; dp[1] = nums[1]; dp[2] = nums[0] + nums[2]; for(int i=3;i<len;i++){ // 中间隔着一个 nums[i-1],防报警就在这里实现 dp[i] = Math.max(dp[i-2],dp[i-3]) + nums[i]; } // 最大值要么是倒数第一家,要么是倒数第二家 return Math.max(dp[len-1],dp[len-2]); } } 更新版 我以前咋写代码这么乱。。 class Solution { public int rob(int[] nums) { if(nums.length == 1) { return nums[0]; } int[] dp = new int[nums.length]; dp[0] = nums[0]; dp[1] = Math.max(nums[1], nums[0]); for(int i = 2; i < nums.length; i++) { dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]); } return dp[nums.length - 1]; } }