力扣第213题 打家劫舍2

前言

记录一下刷题历程 力扣第213题 打家劫舍2


打家劫舍2

原题目:你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。

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

示例 1:

输入:nums = [2,3,2]

输出:3

解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。

示例 2:

输入:nums = [1,2,3,1]

输出:4

解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。

偷窃到的最高金额 = 1 + 3 = 4 。

示例 3:

输入:nums = [1,2,3]

输出:3

分析

我们之前做过一个打家劫舍1 那是一个头尾不相连的问题,而这次打家劫舍2是一个首尾相连的环.以示例1为例,当我们偷1号房子时 2号3号房子都不能偷。当我们偷2号房子时,1号和3号都不能偷,所以只能偷一个房屋,并且偷金额最大的那个房屋。因为我们第一间房和最后一间房是不能都偷的,所以我们可以换一个思路,请看下图:

我们可以把这个环分成两个新的数组,然后使用打家劫舍1里的动态规划的方法,再从这两个数组中选择金额最大的返回它。

代码如下:

c 复制代码
class Solution {
public:
    // 主函数,输入一个整数数组表示每个房屋的钱财,返回能够抢劫到的最大金额
    int rob(vector<int>& nums) {
        // 如果只有一个房屋,直接返回这个房屋的钱财
        if(nums.size() == 1)
        {
            return nums[0];
        }

        // 创建两个新数组:nums1表示从第二个房屋到最后一个房屋,nums2表示从第一个房屋到倒数第二个房屋
        vector<int> nums1(nums.begin() + 1, nums.end());
        vector<int> nums2(nums.begin(), nums.end() - 1);

        // 返回两个子问题的最优解的最大值
        return max(help(nums1), help(nums2));
    }

    // 辅助函数,用于计算一个线性排列的房屋数组的最大抢劫金额
    int help(vector<int>& nums)
    {
        // 创建一个动态规划数组 dp,长度为房屋数量 + 1,用于存储每个位置的最优解
        vector<int> dp(nums.size() + 1, 0);

        // 如果房屋数组不为空,初始化 dp 的第一个元素为第一个房屋的钱财
        if(nums.size() > 0)
        {
            dp[1] = nums[0];
        }

        // 从第二个房屋开始,遍历整个房屋数组
        for(int i = 2; i < nums.size() + 1; i++)
        {
            // dp[i] 表示抢劫前 i 个房屋所能获得的最大金额
            // 递推公式:dp[i] = max(不抢劫当前房屋时的金额, 抢劫当前房屋时的金额)
            dp[i] = max(dp[i-1], dp[i-2] + nums[i-1]);
        }

        // 返回抢劫完所有房屋后的最大金额
        return dp[nums.size()];
    }
};

解释注释

1.int help(vector& nums)

辅助函数:具体解释可以看之前的打家劫舍1

2.vector nums1(nums.begin() + 1, nums.end());vector nums2(nums.begin(), nums.end() - 1);

创建两个新的数组一个是从第二个房屋到最后一个房屋,另一个是从第一个到最后一个房屋。

时间复杂度

相关推荐
Σίσυφος19003 小时前
PCL法向量估计 之 RANSAC 平面估计法向量
算法·机器学习·平面
xhbaitxl3 小时前
算法学习day39-动态规划
学习·算法·动态规划
I_LPL3 小时前
day23 代码随想录算法训练营 回溯专题2
算法·hot100·回溯算法·求职面试
智者知已应修善业3 小时前
【洛谷P9975奶牛被病毒传染最少数量推导,导出多样例】2025-2-26
c语言·c++·经验分享·笔记·算法·推荐算法
Trouvaille ~4 小时前
【Linux】应用层协议设计实战(一):自定义协议与网络计算器
linux·运维·服务器·网络·c++·http·应用层协议
CSCN新手听安4 小时前
【linux】高级IO,I/O多路转接之poll,接口和原理讲解,poll版本的TCP服务器
linux·运维·服务器·c++·计算机网络·高级io·poll
CSCN新手听安4 小时前
【linux】网络基础(三)TCP服务端网络版本计算器的优化,Json的使用,服务器守护进程化daemon,重谈OSI七层模型
linux·服务器·网络·c++·tcp/ip·json
m0_736919104 小时前
C++中的委托构造函数
开发语言·c++·算法
小小小小王王王4 小时前
洛谷-P1886 【模板】单调队列 / 滑动窗口
c++·算法
PPPPPaPeR.4 小时前
光学算法实战:深度解析镜片厚度对前后表面折射/反射的影响(纯Python实现)
开发语言·python·数码相机·算法