Leetcode:198. 打家劫舍

Leetcode:198. 打家劫舍

题目描述

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

示例 1:

输入: [1,2,3,1]
输出: 4
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。

示例 2:

输入: [2,7,9,3,1]
输出: 12
解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
     偷窃到的最高金额 = 2 + 9 + 1 = 12 。

思路

思路1 DP保存所有状态

DP保存所有状态,然后根据$dps[i] = max(dps[i], nums[i] + dps[j]) j\in[0, i-2]$进行状态更新

思路2 DP只保存前三个状态

DP保存前三个状态,然后根据$dps[i] = max(nums[i] + dps[i - 2], nums[i] + dps[i - 3])$进行状态更新

代码

代码1

class Solution {
    public int rob(int[] nums) {
        if (nums == null || nums.length == 0){
            return 0;
        }
        if (nums.length == 1){
            return nums[0];
        }

        int[] dps = new int[nums.length];
        for(int i = 0; i < nums.length; i++){
            if (i < 2){
                dps[i] = nums[i];
            }else if(i == 2){
                dps[i] = nums[i] + nums[0];
            }else{
                dps[i] = nums[i] + Math.max(dps[i - 2], dps[i - 3]);
            }
        }

        return Math.max(dps[nums.length - 1], dps[nums.length - 2]);
    }
}

代码2

class Solution {
    public int rob(int[] nums) {
        if (nums == null || nums.length == 0){
            return 0;
        }
        int pre = 0;
        int cur = 0;
        for(int num: nums){
            int temp = cur;
            cur = Math.max(cur, num + pre);
            pre = temp;
        }
        
        return cur;
    }
}

复杂度分析

思路1时间复杂度

$O(n)$

思路1空间复杂度

$O(n)$

思路2时间复杂度

$O(n)$

思路2空间复杂度

$O(1)$


文章作者: 小风雷
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小风雷 !
评论
 上一篇
Leetcode:279. 完全平方数 Leetcode:279. 完全平方数
Leetcode:279. 完全平方数题目描述给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。 示例 1:输入: n = 12 输出: 3 解释:
2020-04-23
下一篇 
Leetcode:128. 最长连续序列 Leetcode:128. 最长连续序列
Leetcode:128. 最长连续序列题目描述给定一个未排序的整数数组,找出最长连续序列的长度。 要求算法的时间复杂度为 O(n)。 示例:输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 [1
2020-04-22
  目录