算法训练四十八天 | LeetCode 198、213、337打家劫舍专题

news2024/10/6 16:28:35

LeetCode 198 打家劫舍

题目简析:

不能偷相邻的屋子,求能偷到的最大金额

思路分析:

//由于是相邻的才偷,因此,我们对于最基础的三间
//dp[3] 应该是 Math.max(dp[2],dp[1]+nums[3])
//如果第一间加偷第三间的价值大于偷第二间的
// 那么dp[3] = dp[1]+nums[3]
//若不大于,则第三间不偷,保持偷第二间的价值

而另一个疑点就是如何初始化

对于初始化,因为我们从第三间开始判断,那么就要初始化前两间,当只有一间屋子的时候很显然只能偷到屋子里的金额,当有两间屋子的时候,偷的金额那就是,两间里金额大的

dp[0] = nums[0];
dp[1] = Math.max(nums[0],nums[1]);
    public int rob(int[] nums) {
        //dp[i]:偷到第i间房能偷到的最高金额
        int len = nums.length;
        if(len == 0)return 0;
        if(len == 1)return nums[0];
        //这里不需要再+1
        int []dp = new int[len];
        dp[0] = nums[0];
        dp[1] = Math.max(nums[0],nums[1]);
        //因此我们直接从第三间开始判断
        for (int i = 2; i < len; i++) {
            dp[i] = Math.max(dp[i-1], dp[i-2]+nums[i]);
        }
        return dp[len-1];
    }

 状态压缩版:其实只需要三个变量,而代码思路是一样的

class Solution {
    public int rob(int[] nums) {
        int pre1 = 0, pre2 = 0;
        if (nums.length == 1) {
            return nums[0];
        }
        pre2 = nums[0];
        pre1 = Math.max(nums[0], nums[1]);
        for (int i = 2; i < nums.length; i++) {
            int cur = Math.max(pre1, pre2 + nums[i]);
            pre2 = pre1;
            pre1 = cur;
        }
        return pre1;
    }
}

LeetCode 213打家劫舍II

题目简析:

房屋绕环,即第一间和最后一间相邻,不能偷相邻的屋子条件下,求能偷到的最高金额

思路分析:

如代码随想录下图分析:

 

 

 

可以看到情况二三的框的交集就是情况一,说明情况二和情况三把情况一包括了,因此我们只需要考虑包含首元素,不包含尾元素,或者考虑包含尾元素,不包含首元素

    public int rob(int[] nums) {
        //dp[i]:偷到第i间房能偷到的最高金额
        int len = nums.length;
        if (len == 0) return 0;
        if (len == 1) return nums[0];
        //而两段代码是一样的,因此我们提取出来
        //传入数组区间
        int head = rob(nums,0,len-2);
        int tail = rob(nums,1,len-1);
        return Math.max(head,tail);
    }
    //把区间传入即可
    public int rob(int []nums,int start,int end){
        //只有一间屋子的情况
        if(start==end)return nums[start];
        int []dp = new int[nums.length];
        dp[start] = nums[start];
        dp[start+1] = Math.max(nums[start],nums[start+1]);
        for (int i = start+2; i <= end; i++) {
            dp[i] = Math.max(dp[i-1], dp[i-2]+nums[i]);
        }
        return dp[end];
    }

LeetCode 337打家劫舍III

题目简析:

树形的房子排列,不能偷相邻的情况下,求偷得的最大金额

思路分析:

涉及到树,首先去想到dfs/bfs,但是做法不涉及到dp

    //递归,超时
    public int rob(TreeNode root) {
        //若父节点没偷,就可以考虑偷左右子节点
        if(root==null)return 0;
        int money = root.val;
        if (root.left != null) {
            money += rob(root.left.left) + rob(root.left.right);
        }
        if (root.right != null) {
            money += rob(root.right.left) + rob(root.right.right);
        }
        //比较当前偷的金额多还是偷子节点的多
        return Math.max(money,rob(root.left)+rob(root.right));
    }

    //记忆化递归----时间不理想,利用Map来作记忆化数组
    public int rob(TreeNode root) {
        Map<TreeNode, Integer> memo = new HashMap<>();
        return robAction(root, memo);
    }
    int robAction(TreeNode root, Map<TreeNode, Integer> memo) {
        if (root == null)
            return 0;
        //如果已经搜索过了当前结点,就获取偷至当前结点的金额
        if (memo.containsKey(root))
            return memo.get(root);
        int money = root.val;
        if (root.left != null) {
            money += robAction(root.left.left, memo) + robAction(root.left.right, memo);
        }
        if (root.right != null) {
            money += robAction(root.right.left, memo) + robAction(root.right.right, memo);
        }
        int res = Math.max(money, robAction(root.left, memo) + robAction(root.right, memo));
        memo.put(root, res);
        return res;
    }

由此学习了一种新的解题方法:树形dp

    // 3.状态标记递归
    // 执行用时:0 ms , 在所有 Java 提交中击败了 100% 的用户
    // 不偷:Max(左孩子不偷,左孩子偷) + Max(又孩子不偷,右孩子偷)
    // root[0] = Math.max(rob(root.left)[0], rob(root.left)[1]) +
    // Math.max(rob(root.right)[0], rob(root.right)[1])
    // 偷:左孩子不偷+ 右孩子不偷 + 当前节点偷
    // root[1] = rob(root.left)[0] + rob(root.right)[0] + root.val;
    public int rob(TreeNode root) {
        int[] res = robAction1(root);
        return Math.max(res[0], res[1]);
    }

    int[] robAction1(TreeNode root) {
        int res[] = new int[2];
        if (root == null)
            return res;

        int[] left = robAction1(root.left);
        int[] right = robAction1(root.right);

        res[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
        res[1] = root.val + left[0] + right[0];
        return res;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/86506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytest + yaml 框架 -10.allure 生成报告

前言 本插件是基于pytest框架开发的&#xff0c;所以pytest 的插件都能使用&#xff0c;生成报告可以用到 allure 报告 pip 安装插件 pip install pytest-yaml-yoyoallure 报告功能在 v1.0.8 版本上实现 allure 命令行工具 allure 是一个命令行工具&#xff0c;需要去githu…

大话设计模式之设计原则

设计原则 参考链接&#xff1a;https://datawhalechina.github.io/sweetalk-design-pattern/#/content/design_principles/dependence_inversion_principle 主要介绍以下五个设计原则&#xff1a; 1、单一职责原则 顾名思义&#xff0c;一个类只有一个职责&#xff0c;只会…

React 16.8+生命周期(新)

React16之后有三个生命周期被废弃&#xff1a; componentWillMountcomponentWillReceivePropscomponentWillUpdate React 16.8的生命周期分为三个阶段&#xff0c;分别是挂载阶段、更新阶段、卸载阶段。 挂载阶段&#xff1a; constructor&#xff1a;构造函数&#xff0c;最…

【元胞自动机】基于元胞自动机模拟考虑心理策略的人员疏散附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

2022-12-13 工作记录--Vue/JS-音乐的播放与关闭

Vue/JS-音乐的播放与关闭 一、音频资源 音频资源的位置如下&#xff1a;&#x1f447;&#x1f3fb; 二、代码 App.vue 注意点&#xff1a; 1、若切换了音频资源&#xff0c;则需要在 播放音乐前 重新加载资源——见代码里的 myAuto?.load()&#xff1b;2、若切换了页面&…

论文学习——秦淮河水文水动力模型及实时校正

文章目录摘要0 引言1 模型构建1.1 流域概况及资料收集1.2 河道一维水流模拟1.3 边界条件处理1.3.1 流量上边界计算1.3.2 水文下边界处理1.4 节点堰闸流量计算2 实时校正方法2.1 KNN 法2.2 反馈法3 模拟及校正结果4 结论作者&#xff1a;孙文宇、姚成、刘志雨 期刊&#xff1a;《…

Allegro如何编辑过孔的封装参数操作指导

Allegro如何编辑过孔的封装参数操作指导 Allegro可以快捷的编辑过孔的封装,具体操作如下 以编辑这个via的封装为例 用Candence安装目录下面的pad_designer打开过孔的pad封装 打开后的效果如下图 如果需要改成钻孔8mil的孔,只需要在Drill diameter把10改成8即可 钻孔尺寸…

一比一手写迷你版vue,彻底搞懂vue运行机制

前言 现在前端面试Vue中都会问到响应式原理以及如何实现的&#xff0c;如果你还只是简单回答通过Object.defineProperty()来劫持属性可能已经不够了。 本篇文章通过学习文档及视频教程实现手写一个简易的Vue源码实现数据双向绑定&#xff0c;解析指令等。 几种实现双向绑定的…

好物安利:老照片修复软件哪个好?

大家都知道&#xff0c;老照片承载了很多的回忆&#xff0c;还有许多见证了城市的变迁及发展。甚至可以说&#xff0c;那些老照片&#xff0c;每一张都蕴藏着一个故事&#xff0c;能还原一段历史。但这些老照片&#xff0c;或多或少因为之前的设备、或储存不当等问题&#xff0…

【Docker】Docker安装Redis,并配置数据备份同步到宿主机

专栏精选文章 《Docker是什么&#xff1f;Docker从介绍到Linux安装图文详细教程》《30条Docker常用命令图文举例总结》《Docker如何构建自己的镜像&#xff1f;从镜像构建到推送远程镜像仓库图文教程》《Docker多个容器和宿主机之间如何进行数据同步和数据共享&#xff1f;容器…

Spring:Aop

目录 一、Aop简介 AOP相关术语 二、使用AOP 一、Aop简介 AOP(Aspect Oriented Programming)面向切面编程&#xff0c;一种编程范式&#xff0c;指导开发者如何组织程序结 构 原理&#xff1a;将复杂的需求分解出不同方面&#xff0c;将散布在系统中的公共功能集中解决 …

MEE: A Novel Multilingual Event Extraction Dataset 论文解读

MEE: A Novel Multilingual Event Extraction Dataset paper&#xff1a;[2211.05955] MEE: A Novel Multilingual Event Extraction Dataset (arxiv.org) code&#xff1a;None 期刊/会议&#xff1a;EMNLP 2022 摘要 事件抽取&#xff08;EE&#xff09;是信息抽取&#…

OS_用户层的IO软件@缓冲区@磁盘高速缓存@异步IO

文章目录OS_用户层的IO软件缓冲区磁盘高速缓存异步IO用户层的IO软件&#x1f388;1.系统调用2.库函数高速缓存与缓冲区磁盘高速媛存(Disk Cache)缓冲区Buffer缓冲的用途设备速度的巨大差异&#x1f388;缓冲和缓存的比较联系区别缓冲区的结构缓冲的引入单缓冲区和双缓冲区单缓冲…

万应视野|蔡鑫莹:One in All,低代码平台从工具向商业的转变

2015年&#xff0c;AI、5G、大数据、云计算等前沿技术开始崭露头角&#xff0c;软件再出发、工业互联网等相关政策逐渐出台&#xff0c;云畅的悠悠创业路自此竟也走过了8年。 风华绝代总爱乱世生。2020年&#xff0c;百年变局与世纪疫情交织&#xff0c;经济全球化遭遇逆流&…

倾斜摄影模型数据在gis中的应用

倾斜摄影是近年来航测领域逐渐发展起来的新技术&#xff0c;可同时获得同一位置多个不同角度的、具有高分辨率的影像&#xff0c;采集丰富的地物侧面纹理及位置信息&#xff0c;批量建立高质量、高精度的三维GIS模型&#xff0c;对市政、轨道交通、水利水电、智慧城市等各工程领…

一个简单的HTML篮球网页【学生网页设计作业源码】

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

大比分领先!ACCV 2022 国际细粒度图像分析挑战赛冠军方案

写在前面 在刚刚结束的 ACCV 2022 国际细粒度图像分析挑战赛中&#xff0c;我们团队在 133 支参赛队伍中脱颖而出&#xff0c;在 Leadboard-B 上以 2.5 的绝对优势取得冠军。 比赛成绩截图 在比赛过程中&#xff0c;我们使用了一些对细粒度分类十分有效的解决方案。 例如&am…

服务器渲染技术-->Thymeleaf

目录 一.基本介绍 1.Thymeleaf 是什么 2.Thymeleaf 的优点 3. Thymeleaf 的缺点 二.Thymeleaf 机制说明 三.Thymeleaf 语法 1. 表达式 1. 表达式一览 2. 字面量 3. 文本操作 2.运算符 1. 数学运算 2. 布尔运算 3. 比较运算 4. 条件运算 3.th 属性 4.迭代 5.条…

PLC模拟量传输过程

网上对PLC模拟量的一些解释含糊不清&#xff0c;令参考人疑惑重重&#xff0c;搞不懂现场—>PLC—>上位机的过程走向。 . 应该了解什么是数字量&#xff1f;什么是模拟量&#xff1f;下面是我的理解。 数字量&#xff1a;没有单位&#xff0c;表示一个数字&#xff0c;0~…

Linux-iNode-软硬链接

文章目录inode磁盘了解站在OS角度磁盘就是线性结构如何确认inode和后面的那个block相关联呢&#xff1f;如何在大的inode Table中安排一个新文件的inode?目录下创建文件的过程都发生了什么软硬链接软链接&#xff1a;特别像快捷方式使用场景硬链接二者区别&#xff1a;硬链接有…