代码随想录算法训练营第四十七天|198.打家劫舍, 213.打家劫舍II , 337.打家劫舍III

198.打家劫舍

https://leetcode.com/problems/house-robber/description/

思路: 经典的动态规划问题,首先确定dp 数组记录的是打劫到第i家时的收获, dp[0] = 0, dp[1] = values[0]. 然后到第i 家有两个选择, 一个是打劫第i家, 最大收益是dp[i-2] + values[i-1], 或者不打劫第i 家最大收益是 dp[i-1]。  所以递归方程是 dp[i] = max(dp[i-1], dp[i-2]+nums[i-1])

难点: 无

class Solution:def rob(self, nums: List[int]) -> int:if len(nums) == 1:return nums[0]dp = [0 for _ in range(len(nums)+1)]dp[1] = nums[0]for i in range(2, len(dp)):dp[i] = max(dp[i-1], dp[i-2]+nums[i-1])return dp[-1]

213.打家劫舍II 

https://leetcode.com/problems/house-robber-ii/description/

思路: 和上一题类似, 只不过是原本在一条线上的房子变成首位相连了, 也就是说如果打劫了第一家就不能打劫最后一家, 打劫了最后一家就不能打劫第一家。 那么我们分别考虑 打劫nums[1:] 和nums[0:len(nums)-1] , 然后两者取最大值就可以了。

难点: 无

class Solution:def __rob(self, nums: List[int]) -> int:if len(nums) == 1:return nums[0]dp = [0 for _ in range(len(nums)+1)]dp[1] = nums[0]for i in range(2, len(dp)):dp[i] = max(dp[i-1], dp[i-2]+nums[i-1])return dp[-1]def rob(self, nums: List[int]) -> int:if len(nums) == 1:return nums[0]else:return max(self.__rob(nums[:-1]), self.__rob(nums[1:]))

337.打家劫舍III

思路: 这个问题把二叉树和动态规划结合了起来, 感觉有难度的。如果不考虑用动态规划, 如果打劫了一个 node, 那么就不能打劫 node.left, node.right 那么它的最大就是 node.val + rob(node.left.left) + rob(node.left.right)  + rob(node.right.right) + rob(node.right.left) 如果有。 如果不打劫node, 最大收益就是 rob(node.left) + rob(node.right). 而结合了动态规划就比较巧妙了, 我们通过倒叙遍历的方法, 先遍历一个node 的左右两边, 返回一个 tuple, tuple[0] 表示不打劫这个node 的收益, tuple[1] 表示打劫这个node 的最大收益, 如果node==NULL, 返回(0, 0).

然后回到当前node, 打劫它的最大收益是val_1 = node.val + left_val[0] + right_val[0], 不打劫的话是 val_0 = left_val[1] + right_val[1], 然后返回 (val_0, val_1)

难点: 结合点其实很难想到的, 它要返回两个状态的值。 我记得sell stock 类型的问题也有累似的方法。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def transverse(self, node):if not node:return (0, 0)left_ans = self.transverse(node.left)right_ans = self.transverse(node.right)val_0 = max(left_ans[0], left_ans[1]) + max(right_ans[0], right_ans[1]) # 不偷当前节点, 偷左右val_1 = node.val + left_ans[0] + right_ans[0] # 偷当前,不偷左右return (val_0, val_1)def rob(self, root: Optional[TreeNode]) -> int:_ans = self.transverse(root)return max(_ans)

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

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

相关文章

koa2+vue3通过exceljs实现数据导出excel文档

服务端安装exceljs依赖 npm i exceljs服务端实现代码 实现导出excel文件工具方法 const ExcelJS require(exceljs); /*** description: 导出excel文件* param {*} fileHeader 导出的表头* param {*} data 导出的数据* param {*} ctx 上下文对象* return {*}*/ async funct…

计算机三级网络技术综合题第三题、第四题详细解析

第三大题 DHCP报文分析(10分) 一、DHCP工作流程(一般情况下) 报文摘要 对应上面报文1—4 报文1、3DHCP:Request; 报文2、4DHCP:Reply。 例题(第三套):在一…

Flutter 当涉及Listview的复杂滑动布局良好布局方式

目录 引 代码以及概叙 详细解释 SingleChildScrollView shrinkWrap 属性 NeverScrollableScrollPhysics 引 当我们构建界面,很多时候都会需要显示一个能滑动的流布局,同时这个布局还要有些其他的界面元素,同时在flutter中,滑…

大型项目中的敏捷开发实践:原则、方法与工具的应用经验分享

引言 在软件开发领域,大型项目往往伴随着高风险和复杂性,传统的瀑布模型往往难以应对快速变化的需求和不确定的环境。而敏捷开发方法以其灵活、快速响应变化的特点,逐渐成为大型项目管理的有力武器。本文旨在分享我在大型项目中应用敏捷开发…

程序员入行忠告!

点击下方“JavaEdge”,选择“设为星标” 第一时间关注技术干货! 关注我,紧跟本系列专栏文章,咱们下篇再续! 作者简介:魔都技术专家兼架构,多家大厂后端一线研发经验,各大技术社区头部…

十大经典排序之归并排序

文章目录 概要整体架构流程代码实现小结 概要 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 作为一种典型的分而治之思想的算法应用&#xff0…

十五、自回归(AutoRegressive)和自编码(AutoEncoding)语言模型

参考自回归语言模型(AR)和自编码语言模型(AE) 1 自回归语言模型( AR) 自回归语言模型(AR)就是根据上文内容(或下文内容)预测下一个(或前一个&…

安装OpenEBS,镜像总是报错ImagePullBackOff或者ErrImagePull的解决方法

按照 KubeSphere 官方文档安装 OpenEBS,镜像总是报错ImagePullBackOff或者ErrImagePull的解决方法 helm 有很多更换 源 的文章,有一些是写更换阿里云的源,但是阿里云的源根本没更新OpenEBS的镜像。 在网上找到1个可用的源: 可用的…

VSCODE的常用插件

1、中文设置 (1)搜索 chinese Chinese (Simplified) Language Pack for Visual Studio Code C/C Extension Pack (2)配置 通过使用“Configure Display Language”命令显式设置 VS Code 显示语言,可以替代默认 UI…

计算最长的字符串长度

本题要求实现一个函数,用于计算有n个元素的指针数组s中最长的字符串的长度。 函数接口定义: int max_len( char *s[], int n ); 其中n个字符串存储在s[]中,函数max_len应返回其中最长字符串的长度。 裁判测试程序样例: #inclu…

Django性能优化

1.服务器CPU太高的优化 1>在Django项目中使用line_profiler进行性能剖析,您需要遵循以下步骤来设置并使用它: 注:此种方式似乎中间件无法启动!!! 要使用Django与line_profiler进行特定视图的性能测试…

探讨TCP的可靠性以及三次握手的奥秘

🌟 欢迎来到 我的博客! 🌈 💡 探索未知, 分享知识 !💫 本文目录 1. TCP的可靠性机制1.2可靠性的基础上,尽可能得提高效率 2. TCP三次握手过程3. 为何不是四次握手? 在互联网的复杂世界中,TCP&am…

基于springboot的高校教师教研信息填报系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…

SpringBoot3整合Redis基础操作

SpringBoot3整合Redis&基础应用 配套视频:SpringBoot3整合Redis&基础操作视频 1. 概述 SpringBoot是一种用于构建Java应用程序的开发框架,Redis是一个高性能的键值存储数据库,常用于缓存、会话管理、消息队列等应用场景&#xff0…

亚马逊云科技Glue

Glue 最重要的部分, ETL:用于从 A 点(我们的源数据)提取、转换和加载数据到 B 点(目标文件或数据存储库)。 AWS Glue 会为您执行大量此类工作。 转换通常是更繁重的工作,需要从各种来源进行组合…

【嵌入式DIY实例】-自动割草机器

自动割草机器 文章目录 自动割草机器1、割草机器介绍2、硬件准备3、功能设计4、硬件接线5、代码实现本文将介绍如何使用 Arduino 构建一个简易自动割草机机器人或割草机机器人。该机器人可以自动剪掉花园里多余的草。如果花园里有障碍物,它会自动改变方向。帮助以减少人力。 警…

【Elasticsearch】windows安装elasticsearch教程及遇到的坑

一、安装参考 1、安装参考:ES的安装使用(windows版) elasticsearch的下载地址:https://www.elastic.co/cn/downloads/elasticsearch ik分词器的下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases kibana可视化工具下载…

半小时搭建keycloak环境,构建强大的用户中心

第一步: 安装JDK 第二步: 安装Docker 第三步: 部署 keycloak 写一个dockerfile # docker file FROM quay.io/keycloak/keycloak:19.0.3 as builder# Enable health and metrics support ENV KC_HEALTH_ENABLED=true # 设置健康检查启用标志为true ENV KC_METRICS_EN…

Docker 解析:使用 Dockerfile 自动构建镜像

简介 Docker 容器是使用 基础 镜像创建的。一个镜像可以是基本的,只包含操作系统的基本要素,也可以包含一个准备好启动的复杂的预构建应用程序堆栈。 在使用 Docker 构建镜像时,每个操作(例如执行的命令,比如 apt-get…

网络编程套接字——实现简单的UDP网络程序

目录 1、预备知识 1.1、认识端口号 1.2、端口号 vs 进程pid 1.3、认识TCP协议 1.4、认识UDP协议 1.5、网络字节序 2、socket编程接口 2.1、socket常见API 2.2、sockaddr结构 3、实现一个简易的UDP服务器和客户端通信 log.hpp UdpServer.hpp UdpClient.cc Main.cc…