zoukankan      html  css  js  c++  java
  • LeetCode198. 打家劫舍

    思路:状态的定义很重要。

    状态定义1:  dp[i]表示 到第 i 个房子的最大金额

    class Solution {
        /**
         *  dp[n]表示 到第n个房子的最大金额
         *      1.如果偷第n个房子,由于不能相邻,dp[n]= dp[n-2] + nums[n]
         *      2.如果不偷第n个房子,那么dp[n] = dp[n-1] (即等于到第n-1个房子的最大金额)
         */
        public int rob(int[] nums) {
            int n = nums.length;
            if (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(nums[i] + dp[i-2], dp[i-1]);
            }
            return dp[n-1];
            /**
             *  优化空间复杂度为 O(1)。  由于 i 只依赖 i-1 和 i-2 两个状态
             */
            /*
            int a = nums[0]; // a 表示 i-2
            int b = Math.max(nums[0], nums[1]); // b 表示 i-1
            for (int i = 2; i < n; i++) {
                int temp = Math.max(nums[i] + a, b);
                a = b;
                b = temp;
            }
            return b;
            */
        }
    }

    状态定义2: dp[i] 表示 从前 i 个房子能偷到的最大金额

    class Solution {
        public int rob(int[] nums) {
            int n = nums.length;
            if (n == 0) return 0;
            if (n == 1) return nums[0];
    
            // dp[i] 表示 从前 i 个房子能偷到的最大金额
            int[] dp = new int[n + 1];
            dp[0] = 0;
            dp[1] = nums[0];
            for (int i = 2; i <= n; i++) {
                dp[i] = Math.max(nums[i-1] + dp[i-2], dp[i-1]);
            }
            return dp[n];
        }
    }
  • 相关阅读:
    Python中文乱码(转)
    一千行MySQL学习笔记
    pycharm在同目录下import,pycharm会提示错误,但是可以运行
    PyCharm3.0默认快捷键
    Sublime Text 3 快捷键
    window下spyder的快捷键
    Anaconda更新和第三方包更新
    PyCharm 教程
    centos7.9 源码编译安装php
    centos7.9 源码编译安装nginx
  • 原文地址:https://www.cnblogs.com/HuangYJ/p/14217100.html
Copyright © 2011-2022 走看看