每日一题:打家劫舍(C++)

2023-11-09

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

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

示例 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 。

解题思路动态规划
1.如果只有一间房,只能偷窃这一个房子,最大金额为改偷窃金额。
2.如果有二间房,因为不能偷相邻的两间房,所以只能偷这两间房中金额较大的房间。
3.如果房间数大于2呢(K > 2)
⑴ 偷窃第K个房间,就不能偷窃K - 1 的房间,能偷窃的总金额为 前K - 2的最大金额 与 第K个房间之和。
⑵ 不偷窃第K个房间,那么总金额就为前 K - 1 个房间的最大总金额。

总金额为这两项的较大那个值。states[i] = max(states[i - 1], states[i - 2] + nums[i]);

时间复杂度为O(n),空间复杂度为O(n)。

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

优化 动态规划 + 滚动数组
1.first 为 偷第K个房间,能偷窃的总金额为 前K - 2的最大金额 与 第K个房间之和。
2.second 为 不偷第K个房间,前 K - 1 个房间最大金额。
时间复杂度为O(n),空间复杂度为O(1)。

class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();
        if(n == 0)
            return 0;
        if(n == 1)
            return nums[0];
        
        vector<int> states = vector<int> (n,0);
        int first = nums[0];
        int second = max(nums[0], nums[1]);
        for(int i = 2; i < n; ++i)
        {
            int temp = second;
            second  = max(second, first + nums[i]);
            first= temp;
        }
        return second;
    }
};

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每日一题:打家劫舍(C++) 的相关文章

随机推荐

  • 2020 mse 清华_【清华大学】清华大学2020届推免生入围名单汇总

    我把能找到的清华入围名单 进入复试名单 都给大家发一下 做一个资料备份 尤其是有些系所的名单有本科学校 这可是非常珍贵的分析资料 首先给我的现在专业 招生简章 清华大学经济管理学院 http masters sem tsinghua edu
  • pop服务器未响应,servlet测试控制台无反应啊??求大神帮忙,

    String path request getContextPath String basePath request getScheme request getServerName request getServerPort path gt
  • 几种用户相似度计算方法及其优缺点

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 进行用户协同过滤时 一个关键问题是如何计算用户之间的相似性 比较常见的计算用户相似度的算法有余弦相似性 皮尔森系数 调整余弦相似性三种 这三种相似性都是基于一个称为用户 项
  • Dos常用命令及解释大全

    目录 前言 一 系统信息 二 网络 三 用户 四 端口进程服务 五 共享 六 文件操作 总结 前言 DOS是 磁盘操作系统 Disk Operating System 的缩写 它是一种早期的操作系统 最初在20世纪80年代广泛用于个人计算机
  • 完成U-net细胞分割的一些准备

    使用本地上传文件 from google colab import files uploaded files upload for fn in uploaded keys print User uploaded file name with
  • vue3中的Suspense组件

    用法 插槽名字固定 形成一个异步组件 比如这边 如果我们像之前那样进行静态引入的话 比如 child组件迟迟没有加载完毕 那么整个app vue组件也不会出现 而是要等到child加载完毕了之后再一起出现 而使用了defineAsyncCo
  • Python画图之浪漫樱花

    import turtle as T import random import time 画樱花的躯干 60 t def Tree branch t time sleep 0 0005 if branch gt 3 if 8 lt bran
  • 真的!!!两行css代码实现瀑布流,html,css最简单的瀑布流实现方式!

    两行css如下 列间距 可有可无 默认30px column gap 0 效果图如下 说明 不存在一边列表过长问题 很均匀 没有缺点 2019年1月12日 我用的chrome 版本 70 0 3538 102 正式版本 64 位 以上代码没
  • C语言:LeetCode第一题 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

    给定一个整数数组 nums 和一个目标值 target 请你在该数组中找出和为目标值的那 两个 整数 并返回他们的数组下标 你可以假设每种输入只会对应一个答案 但是 你不能重复利用这个数组中同样的元素 示例 给定 nums 2 7 11 1
  • newlab平台stm32总结

    详细资源包下载 点击此处 一 GPIO的输出 1 时钟设置 2 调用初始化函数 3 输出函数 1 GPIO WriteBit 端口 引脚 BitAction 0 低 GPIO WriteBit 端口 引脚 BitAction 1 高 2 G
  • pytest单元测试框架详解+Pytest+Allure环境的搭建

    参考 https blog csdn net liuchunming033 category 3193659 html 一 Pytest简介 pytest是python的一种单元测试框架 与python自带的unittest测试框架类似 但
  • PPTP - GRE

    PPTP Point to Point Tunneling Protocol 点对点隧道协议 GRE Generic Routing Encapsulation 通用路由封装 PPTP 的连接过程如下图 PPTP 可以用于在 IP 网络上建
  • [译]人脸检测与人脸识别简介

    From http www shervinemami co cc faceRecognition html Translated by 11 人脸识别 是一个在计算机视觉和生物特征识别领域十分活跃的话题 这个主题已经被给力地研究了25年 并
  • 海康威视网络摄像机远程监控配置(DDNS)

    http wzy02 blog 163 com blog static 300006082013111911918426 海康威视网络摄像机远程监控配置 海康威视网络摄像机出厂的默认IP地址 为192 0 0 64 需要将IPC的IP地址设
  • 从零开始一起学习SLAM(9)不推公式,如何真正理解对极约束?

    文章目录 对极几何基本概念 如何得到极线方程 作业 此文发于公众号 计算机视觉life 原文链接 从零开始一起学习SLAM 不推公式 如何真正理解对极约束 自从小白向师兄学习了李群李代数和相机成像模型的基本原理后 感觉书上的内容没那么难了
  • MyBatis实现In查询

    文章目录 一 SQL语法实现In查询 二 MyBatis实现In查询 1 Dao层方法的参数只有一个 2 Dao层方法的参数有多个 2 1 使用 Param xxx 实现 2 2 使用Map实现 参考资料 一 SQL语法实现In查询 SQL
  • 小学计算机的一些课题,小学信息技术课题申报题目参考

    小学信息技术课题申报题目参考 分类 课题研究 发表时间 2019 12 12 14 02 小学信息技术课题申报时 课题组织方通常会给予课题指南 亦或者选题范围 需要申报者根据自身的擅长领域以及实际工作遇到的问题 来确定研究的选题 以下是 小
  • unity之代码修改Shader参数值

    代码修改Shader参数 Shader 源代码下载 Unity 每次版本更新的时候 不单单会更新 Unity 配套的资源也是会一块更新 的 比如版本配套的 Shader 源代码 一 下载步骤 1 打开unity官网将纵向滑动条拉倒最底部点击
  • 转载:count(*)和count(1)的区别

    原始链接 https blog csdn net weixin 43980049 article details 89327782 count 和count 1 的区别是什么 weixin 43980049 2019 04 16 10 42
  • 每日一题:打家劫舍(C++)

    题目描述 你是一个专业的小偷 计划偷窃沿街的房屋 每间房内都藏有一定的现金 影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统 如果两间相邻的房屋在同一晚上被小偷闯入 系统会自动报警 给定一个代表每个房屋存放金额的非负整数数组 计