美文网首页
LeetCode-198. 打家劫舍

LeetCode-198. 打家劫舍

作者: 傅晨明 | 来源:发表于2019-12-04 14:11 被阅读0次

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 。


    /**
     * a[i] : 0...i能偷到 max value:a[n-1]
     * a[i][0,1] : 0:i不偷 , 1:i偷
     * 
     * a[i][0] = max(a[i - 1][0], a[i - 1][1]);
       a[i][1] = a[i - 1][0] + nums[i];
     * 
     */
    public int rob(int[] nums) {
        int n = nums.length;
        if (nums == null || n == 0) {
            return 0;
        }
        int[][] a = new int[n][2];
        a[0][0] = 0;
        a[0][1] = nums[0];
        for (int i = 1; i < n; i++) {
            a[i][0] = Math.max(a[i - 1][0], a[i - 1][1]);
            a[i][1] = a[i - 1][0] + nums[i];
        }
        return Math.max(a[n - 1][0], a[n - 1][1]);
    }
    
     //使用一维数组
    /**
     * a[i]:0...i天,且nums[i]必偷的最大值
     * a[i] = max(a[i - 1], a[i - 2] + nums[i]);
     */
    // DP:dp[i] = max( dp[i - 1] , dp[i - 2] + nums[i])
    public int rob2(int[] nums) {
        int n = nums.length;
        if (nums == null || n == 0) {
            return 0;
        }
        if (n == 1) {
            return nums[0];
        }
        int[] dp = new int[n];
        dp[0] = nums[0];
        dp[1] = Math.max(nums[0], nums[1]);
        int res = dp[1];
        for (int i = 2; i < n; i++) {
            dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);
            res = Math.max(res, dp[i]);
        }
        return res;
    }
    
    //去除res
    public int rob3(int[] nums) {
        int n = nums.length;
        if (nums == null || n == 0) {
            return 0;
        }
        if (n == 1) {
            return nums[0];
        }
        int[] dp = new int[n];
        dp[0] = nums[0];
        dp[1] = Math.max(nums[0], nums[1]);
        for (int i = 2; i < n; i++) {
            dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);
        }
        return dp[n - 1];
    }

    //消除数组
    public int rob4(int[] nums) {
        int prevMax = 0;
        int currMax = 0;
        for (int num : nums) {
            int temp = currMax;
            currMax = Math.max(prevMax + num, currMax);
            prevMax = temp;
        }
        return currMax;
    }

rob4()参考:
https://leetcode-cn.com/problems/house-robber/solution/da-jia-jie-she-by-leetcode/

相关文章

  • LeetCode-198. 打家劫舍

    198. 打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是...

  • LeetCode-198. 打家劫舍

    原题链接:https://leetcode-cn.com/problems/house-robber/ 题目: 你...

  • LeetCode-198-打家劫舍

    LeetCode-198-打家劫舍 198. 打家劫舍[https://leetcode-cn.com/probl...

  • 诗歌:小强盗

    小强盗 文/sunshine珊珊 去打家劫舍呀 只劫他一家 去打家劫舍呀 金山不要 银矿不要 去打家劫舍呀 只劫一...

  • 补卡-打家劫舍

    198. 打家劫舍

  • 返回大小姐星级酒店

    华东交大打家劫舍

  • v 的很简单

    打家劫舍看到半部分

  • 打家劫舍

    你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连...

  • 打家劫舍

    题目描述 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋...

  • 打家劫舍

    打家劫舍 经典的动态规划入门题目 题一 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷...

网友评论

      本文标题:LeetCode-198. 打家劫舍

      本文链接:https://www.haomeiwen.com/subject/niflgctx.html