力扣 198.打家劫舍【中等】

198.打家劫舍

  • 1 题目
  • 2 思路
  • 3 代码
  • 4 结果

1 题目

题目来源:力扣(LeetCode)https://leetcode.cn/problems/house-robber

题目:你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

2 思路

有三种情况:

  1. 只有一间房
    偷这间房,获得最大收益
  2. 只有两间房
    选择金额较大的房间,获得最大收益
  3. 房间数大于2
    对于第i间房,偷窃的方式有两种:(1)偷第 i 间房,获得的最大收益为第 i 间房金额+前面 i - 2 间房的最大收益;(2)不偷第 i 间房,获得的最大收益为前 i - 1 间房的最大收益。
    因此解题思路为:从前往后,依次计算第 i 间房可以获得的最大收益并存储,直到 i = n。
    空间优化:计算第 i 间房最大收益时,只需要用到前 i - 1 结果和前 i - 2 结果,因此只需要一个长度为2的数组记录这两个结果,以减少空间复杂度

3 代码

int rob(vector<int>& nums)
{
    int length = nums.size();
    if(length==0)
    {
        return 0;
    }
    else if(length==1)
    {
        return nums[0];
    }
    else if(length == 2)
    {
        return max(nums[0],nums[1]);
    }
    else
    {
        long sum = 0;
        long i_max[length];
        i_max[0] = nums[0];
        i_max[1] = max(nums[0],nums[1]);
        for(int i=2;i<nums.size();i++)
        { 
            i_max[i] = max(i_max[i-1],i_max[i-2]+nums[i]);
        }
        return i_max[length-1];
    }  
}

4 结果

在这里插入图片描述

你可能感兴趣的:(leetcode,算法,c++)