首页 > 编程语言 >【动态规划】【官解+整洁度优化+状态压缩-空间优化算法】力扣198.打家劫舍

【动态规划】【官解+整洁度优化+状态压缩-空间优化算法】力扣198.打家劫舍

时间:2024-07-22 16:56:53浏览次数:20  
标签:偷窃 198 nums int 官解 房屋 优化 dp size

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

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

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

在这里插入图片描述

官方解法

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];
    }
};

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

解决这个问题的动态规划思想就是,用一个动态规划数组dp来储存前 i 家最多可偷窃金额,而dp[i]的最大金额,由之前盗窃过的房屋的最大金额,以及nums[i]目前房屋可盗窃金额两者组成。在计算dp[i]的的时候,会出现两种情况,一种是第 i 间房屋不被盗窃,这个时候,dp[i]将会与dp[i-1]相等;另一种情况是第 i 间房屋被盗窃,这时候第 i - 1家房屋不能被盗窃,所以dp[i] = dp[i-2] + nums[i]。所以可以列出状态转移方程dp[i]=max(dp[i−2]+nums[i],dp[i−1])。由于我们让i = 0时候表示第一间房屋,所以dp最大索引为nums.size() - 1,返回dp[nums.size() - 1]即可。

简洁度优化

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

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

将整体向后偏移两位,避免手动初始化,使得代码简洁,但是会造成额外两个元素的空间浪费。

状态压缩-空间优化算法

class Solution {
public:
    int rob(vector<int> &nums) {
        int f0 = 0, f1 = 0;
        for (int x : nums) {
            int new_f = max(f1, f0 + x);
            f0 = f1;
            f1 = new_f;
        }
        return f1;
    }
};

时间复杂度: O(n)
空间复杂度: O(1)

在上述状态转移方程中,要计算 dp[i],只需要 dp[i-1] 和 dp[i-2]。因此,不需要存储整个 dp 数组,只需存储两个变量来记录 dp[i-1] 和 dp[i-2] 即可。这两个变量可以被更新以反映当前和前一个状态。所以定义f0和f1两个持久变量,new_f这个临时变量就可以反映状态转移方程。

标签:偷窃,198,nums,int,官解,房屋,优化,dp,size
From: https://blog.csdn.net/sjsjs11/article/details/140602614

相关文章

  • Aquila优化算法(基本原理+matlab源代码)—— 基于Aquila Optimizer原始论文分析
    Matlab源代码位于:AquilaOptimizer:Ameta-heuristicoptimizationalgorithm-FileExchange-MATLABCentral(mathworks.cn)1Aquila优化算法AO是一种基于种群优化方法,受启发于Aquila捕获猎物的方式。Aquila捕获猎物的方式主要有四种:(1)有垂直弯曲的高空翱翔(2)用短滑翔攻......
  • VINS-FUSION 优化-IMU预积分因子(三)
    在VINS-FUSION优化-IMU预积分因子(一)中介绍了IMU预积分及其于优化变量的全部雅克比矩阵的推导,(二)中文章结合VINS-FUSION源码,完成优化-IMU预积分因子的使用。本文介绍预积分中方差的计算。一、引出​方差作为调节各残差项的权重,方差计算如下:Fk、Gk是离散时间下的状态传递方程......
  • 编辑距离与滚动数组优化 - 二维动态规划模板
    题目:编辑距离。思路显然,定义\(f[i][j]\)表示字符串\(a\)中前\(i\)个字符到字符串\(b\)中前\(j\)个字符的编辑距离。那么对于\(a_i=b_j\)时,我们对当前位无需进行任何编辑操作,则\(f[i][j]=f[i-1][j-1]\)。如果\(a_i\neb_j\),那么我们就要对当前位进行编辑:......
  • 实战:ForkJoinPool对大文件导入技术优化指南
    1、ForkJoinPool简介Fork/Join框架是Java7提供了的一个用于并行执行任务的框架。ForkJoinPool是Java中提供了一个线程池,特点是用来执行分治任务。主题思想是将大任务分解为小任务,然后继续将小任务分解,直至能够直接解决为止,然后再依次将任务的结果合并。ForkJoinPool是一种工......
  • 超星未来梁爽:软硬件协同优化,赋能AI 2.0新时代
    近日,第三届清华大学汽车芯片设计及产业应用研讨会暨校友论坛在芜湖成功举行。作为本次活动的特邀嘉宾,超星未来联合创始人、CEO梁爽博士出席并发表主题演讲《软硬件协同优化,赋能AI2.0新时代》。大模型是AI2.0时代的“蒸汽机”AI+X应用落地及边缘计算将成为关键自ChatGPT......
  • 线段树优化建图一种编号方式的理解
    intid(intl,intr){return(l+r)|(l!=r);}//代码1证明思路:引导并说明某种做法发生冲突的情况,并证明修改后不会发生冲突首先让我们考虑如果为intid(intl,intr){return(l+r);}//代码2会出现什么冲突,如图此时[1,3]与[2,2],[1,5]与[3,3]冲突结论1:线段树中序......
  • 【最优化方法】期末考试题型讲解部分 - 凸集的证明
    题型填空(10道题左右)、证明题、计算题、应用题证明题考察:第一章习题题目证明集合(S)是凸集集合(S)定义如下:S={......
  • 在K8S中,ELK是如何实现及如何优化的ES?
    ELK栈(Elasticsearch、Logstash、Kibana)在Kubernetes(K8S)环境中是用于日志收集、分析和可视化的强大工具组合。其中,Elasticsearch作为核心存储和搜索引擎,承担着存储大量日志数据和提供高效搜索的能力。以下是如何在K8S中实现及优化Elasticsearch的详细说明:1.实现Elasticsearchin......
  • elasticsearch8.X tokenizer分词器优化
    一、使用指定中文分词器1.1一个查询小例子我们安装好es和kibana之后,就可以在kibana控制台开始我们的查询探索之旅。首先创建一个包含了两个字段“product"和"summary"的索引product_00:PUTproduct_00{"mappings":{"properties":{"product":{"typ......
  • 前端体验优化(5)——后台
    从0开始搭建一套后台管理系统,成本巨大,所以都会选择一套成熟的组件库,基于此,再堆叠业务逻辑。我们公司的组件库基于AntDesign。AntDesign包含一套完整的后台解决方案,不仅提供了75个组件,还开源了整套设计方案,配色、字体、图标、布局等,还分享了众多的用户体验案例。官方基......