代码
class Solution { public int rob(int[] nums) { int size = nums.length; if( size <= 1) { return size == 0 ? 0 : nums[0]; } //1.确定dp数组 及其下标含义 //dp[i]: 考虑下标i(包含下标i)以内的房屋,最多可以偷窃的金额为dp[i]。 //2.确定递推公式 //偷第i个房间,dp[i] = dp[i - 2] + nums[i]; //不偷第i个房间,dp[i] = dp[i - 1]; //dp = Math.max(dp[i - 2 ] + nums[i], dp[i - 1]); //3.dp数组初始化 //4.确定遍历顺序 //由递推公式可知,公式基础是dp[0],dp[1] int [] dp = new int[size]; dp[0] = nums[0]; dp[1] = Math.max(nums[0],nums[1]); for(int i = 2; i < size; i++ ) { dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]); } return dp[size - 1]; }}
空间优化
class Solution { public int rob(int[] nums) { if(nums.length == 1) return nums[0]; int a = nums[0]; int b = Math.max(nums[0],nums[1]); int size = nums.length; for(int i = 2; i < size; i++) { int t = Math.max(a + nums[i],b); a = b; b = t; } return b; }}