• 198. LeetCode 打家劫舍


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

    给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
    示例 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 。
    

    动态规划解法:
    dp[i] 为第i间房屋所能偷到的最大金额,有动态方程: dp[i] = max(dp[i-2]+nums[i],dp[i-1]); // nums[i] 为第i间房屋所能偷到的金额。

    C++解法:

    class Solution {
    public:
        int rob(vector<int>& nums) {
            if(nums.empty())
                return 0;
            if(nums.size() == 1)
                return nums[0];
            vector<int> dp = vector<int>(nums.size(),0);
            dp[0] = nums[0];
            dp[1] = max(nums[0],nums[1]);
            for(int i = 2;i < nums.size();i++){
                dp[i] = max(dp[i-2]+nums[i],dp[i-1]);
            }
            return dp[nums.size()-1];
        }
    };
    

    次过程只能用到三个数组 dp[i-2],dp[i-1],dp[i] 造成内存空间浪费,考虑使用三个int变量,一个变量为临时变量,back_first,back_second交替
    优化如下:

    int rob(vector<int>& nums) {
            if(nums.empty())
                return 0;
            if(nums.size() == 1)
                return nums[0];
            int back_second = nums[0],back_first = max(nums[0],nums[1]),temp=0;
            for(int i = 2;i < nums.size();i++){
                temp = back_first;
                back_first = max(back_second+nums[i],back_first);
                back_second = temp;
            }
            return back_first;
        }
    

    执行用时:

    0 ms, 在所有 C++ 提交中击败了 100.00% 的用户 
    内存消耗:7.6 MB, 在所有 C++ 提交中击败了 97.52% 的用户
    
  • 相关阅读:
    ubuntu安装后做得几件事情 【robby_chan】
    malloc函数的一种简单的原理性实现[转]
    了解B树 B+树
    win下格式转为utf8 编码 转码
    log4j2与slf4j日志桥接
    java获取当前行数
    java获取服务器ip地址解决linux上为127.0.0.1的问题
    log4j2的基本使用
    navicator使用之mysql
    log4j与log4j2日志文件的操作
  • 原文地址:https://www.cnblogs.com/outxiao/p/13557222.html
Copyright © 2020-2023  润新知