题目

image.png

代码

  1. class Solution {
  2. public int rob(int[] nums) {
  3. int size = nums.length;
  4. if( size <= 1) {
  5. return size == 0 ? 0 : nums[0];
  6. }
  7. //1.确定dp数组 及其下标含义
  8. //dp[i]: 考虑下标i(包含下标i)以内的房屋,最多可以偷窃的金额为dp[i]。
  9. //2.确定递推公式
  10. //偷第i个房间,dp[i] = dp[i - 2] + nums[i];
  11. //不偷第i个房间,dp[i] = dp[i - 1];
  12. //dp = Math.max(dp[i - 2 ] + nums[i], dp[i - 1]);
  13. //3.dp数组初始化
  14. //4.确定遍历顺序
  15. //由递推公式可知,公式基础是dp[0],dp[1]
  16. int [] dp = new int[size];
  17. dp[0] = nums[0];
  18. dp[1] = Math.max(nums[0],nums[1]);
  19. for(int i = 2; i < size; i++ ) {
  20. dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);
  21. }
  22. return dp[size - 1];
  23. }
  24. }

空间优化

  1. class Solution {
  2. public int rob(int[] nums) {
  3. if(nums.length == 1) return nums[0];
  4. int a = nums[0];
  5. int b = Math.max(nums[0],nums[1]);
  6. int size = nums.length;
  7. for(int i = 2; i < size; i++) {
  8. int t = Math.max(a + nums[i],b);
  9. a = b;
  10. b = t;
  11. }
  12. return b;
  13. }
  14. }