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

LeetCode 198.打家劫舍

题目链接:198.打家劫舍

踩坑:很多坑,自动把它当作背包问题了,但其实这就是一个普通的动态规划题目,背包问题本质上是一个二维问题,只是可以简化成一维,想要抽象为背包问题首先就是要明确背包大小物品重量物品价值。而本题的dp数组的含义是dp[i]:[0, i]家能偷到的最大价值,其中并不涉及到背包大小。

思路:

  1. dp数组含义:dp[i]:[0, i]家能偷到的最大价值
  2. 递推公式:dp[i] = max(dp[i - 2] + nums[i], dp[i-1])
  3. 初始化:dp[0] = nums[0]; dp[1] = max(nums[0], nums[1]);
  4. 遍历顺序:从小到大

代码:

class Solution {
public:int rob(vector<int>& nums) {if(nums.size() == 1) return nums[0];if(nums.size() == 2) return max(nums[0], nums[1]);vector<int> dp(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];}
};

LeetCode 213.打家劫舍II

题目链接:213.打家劫舍II

踩坑:真给卡哥说中了,一有环就不知道从哪里开始,哪里结束。

思路:首尾相接带来的变化就是首尾只能选择一个或者都不选,一共三种情况。然而首尾只选其一包含了二者都不选的情况,所以只需要分别计算不选头,不选尾的两种情况并取最大即可。

代码:

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

LeetCode 337.打家劫舍III

题目链接:337.打家劫舍III

踩坑:想到了暴力解法,但是超时了。。。(苦呀西

思路:关键在于dp数组的定义,在暴力解法中递归函数的返回值是该节点能偷到的最大值。举例节点A返回从该节点出发能偷到的最大值,B是其父节点。如果从B出发,想知道不偷A能得到的最大值就不得不重新遍历A的子树,超时也是因为大量这样的重复计算。所以,如果节点返回的是一个数组,里面有从该节点出发,偷该节点能得到的最大值与不偷该节点能得到的最大值的话,就可以解决这个问题。

代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> tracking(TreeNode* root){if(root == nullptr) return vector<int>{0, 0};vector<int> left = tracking(root->left);vector<int> right = tracking(root->right);int val1 = max(left[0], left[1]) + max(right[0], right[1]);int val2 = left[0] + right[0] + root->val;return vector<int>{val1, val2};}int rob(TreeNode* root) {vector<int> result = tracking(root);return max(result[0], result[1]);}
};

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

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

相关文章

探索Scala的类型奥秘:协变与逆变全解析

&#x1f504; 探索Scala的类型奥秘&#xff1a;协变与逆变全解析 在Scala的强类型系统中&#xff0c;协变&#xff08;covariance&#xff09;和逆变&#xff08;contravariance&#xff09;是两个核心概念&#xff0c;它们允许我们在泛型编程中更灵活地使用类型。本文将深入…

03-权限绕过漏洞

一、基础知识 水平越权 水平越权是指用户在系统中拥有超出其权限范围的访问权限。这可能导致安全漏洞和潜在的风险&#xff0c;因为用户可以访问他们不应该有权访问的敏感信息或执行他们不应该执行的操作。 垂直越权 垂直越权是指用户或攻击者利用系统中的漏洞或错误配置&a…

【横穿自动驾驶】读书笔记

我自己&#xff0c;有时候还是有些眼高手低的&#xff0c;但是技术领域多读书大概是没错的。 最近想读完下面这两本书&#xff1a; Feedback control of dynamic systemAlgorithms for Optimization 第二本不用多说&#xff0c;就是求解优化问题的方法综述。横穿自动驾驶系列…

webform 连接连接数据的操作

web-form 查询数据库 &#xff0c;从配置文件中读取字符信息 查询 // 从配置文件中读取数据 string sqlstr // 获取数据库连接字符串ConfigurationManager.ConnectionStrings["staffConnectionString2"].ConnectionString;DataTable dt new DataTable(); // 存储…

《零信任时代的网络安全:2024年的新挑战与机遇》

《零信任时代的网络安全&#xff1a;2024年的新挑战与机遇》 引言 随着数字化转型的深入&#xff0c;网络安全的重要性日益凸显。零信任模型作为新一代网络安全架构&#xff0c;其核心理念是“永不信任&#xff0c;始终验证”。2024年&#xff0c;零信任模型已经成为企业网络…

Build Redundancy at Every Tier(在每一层构建冗余)

Build Redundancy at Every Tier&#xff08;在每一层构建冗余&#xff09; 什么是冗余&#xff1f; 冗余指的是在系统的不同层次&#xff08;或组件&#xff09;中添加备用资源或备份&#xff0c;以确保在部分组件发生故障时&#xff0c;系统仍然能够正常运行。 为什么大型…

Orangepi Zero2使用外设驱动库wiringOP配合定时器驱动SG90舵机

目录 一、舵机的基本认知和硬件接线 1.1 舵机的基本认知&#xff1a; 1.2 硬件接线&#xff1a; 1.3 怎么控制舵机旋转不同的角度&#xff1a; 二、Linux定时器 2.1 定时器setitimer()函数原型和头文件&#xff1a; 2.2 信号处理函数signal()原型和头文件&#xff1a; 2…

<电力行业> - 《第10课:变电》

1 变电 变电环节&#xff0c;顾名思义就是改变电压的环节&#xff0c;主要是在变电站和变电所完成的。变电站和变电所主要区别在于&#xff1a;变电站比变电所更大。 发电厂的变压器和配电变压器也属于“变电”&#xff0c;但我们在说电网环节时&#xff0c;变电特指电网公司…

嵌入式软件常用测试工具

嵌入式软件常用的测试工具和方法可以总结如下&#xff1a; 测试工具 GDB&#xff1a; 描述&#xff1a;GDB是一个开源的调试工具&#xff0c;常用于GNU编译器集合中&#xff0c;支持多种编程语言&#xff0c;如C、C、Java等。功能&#xff1a;通过命令行与目标应用程序进行交…

【STM32嵌入式系统设计与开发---传感器拓展】——1_4_标准库FreeRTOS移植实验

目录 雅俗理解源码下载链接知识拓展步骤1&#xff1a;stm32f103vet6移植freeRTOS步骤:&#xff08;1&#xff09;准备开发环境&#xff08;2&#xff09;添加FreeRTOS移植 致谢 雅俗理解 雅&#xff1a;FreeRTOS是一个开源的实时操作系统&#xff08;RTOS&#xff09;&#xf…

支持向量机(SVM)在机器学习中的简单示例

目录 工作原理 核函数 SVM用于分类 结果分析 结论 ❤❤❤动动发财的小手点点赞点点关注哦~~~❤❤❤ 支持向量机是一种强大的监督学习模型&#xff0c;用于分类和回归任务。它通过找到数据点之间的最优边界来区分不同的类别。SVM特别适用于那些具有清晰边界但线性不可分的…

Codeforces Beta Round 7 C. Line 题解 数论 扩展欧几里得

Line 题目描述 A line on the plane is described by an equation A x B y C 0 AxByC0 AxByC0 . You are to find any point on this line, whose coordinates are integer numbers from − 5 ⋅ 1 0 18 -510^{18} −5⋅1018 to 5 ⋅ 1 0 18 510^{18} 5⋅1018 inclusiv…

RabbitMQ-交换机的类型以及流程图练习-01

自己的飞书文档:‌‍‬‍‬‍​‍‬​⁠‍​​​‌⁠​​‬‍​​​‬‬‌​‌‌​​&#xfeff;​​​​&#xfeff;‍​‍​‌&#xfeff;⁠‬&#xfeff;&#xfeff;&#xfeff;​RabbitMQ的流程图和作业 - 飞书云文档 (feishu.cn) 作业 图片一张 画rabbit-mq 消息发…

测试开发工程师需要掌握什么技能?

测试开发工程师是软件开发中至关重要的角色之一。他们负责编写、维护和执行自动化测试脚本、开发测试工具和框架&#xff0c;以确保软件的质量和稳定性。为了成为一名优秀的测试开发工程师&#xff0c;你需要掌握以下技能&#xff1a; 1. 编程技能&#xff1a; 作为测试开发工…

LabVIEW程序员应该怎么提高自己的工作能力?

作为一名LabVIEW程序员&#xff0c;提升工作能力可以从以下几个方面入手&#xff1a; 1. 深入理解LabVIEW基础 掌握LabVIEW编程语言&#xff1a;熟悉LabVIEW的图形化编程方式&#xff0c;理解其数据流编程模型。熟悉常用的VI&#xff08;虚拟仪器&#xff09;和函数&#xff1…

计算机网络原理及应用

第一章 计算机网络概述 【1】局域网 局域网是指在某一区域内由多台计算机互联而成的计算机通信网络。 【1】互通 两个网络之间可以交换数据。 第二章 计算机网络的体系结构 【1】语义 何时发出何种控制信息&#xff0c;完成何种动作以及做出何种响应。 【2】简述网络协…

redis删除通配的keys

删除通配kubiex:market:history_data_swap_的所有key 注&#xff1a;如果有很多键&#xff0c;手动删除会比较麻烦&#xff0c;可以使用 Lua 脚本来批量删除&#xff1a; ~# redis-cli -h ip -a 127.0.0.1:6379> EVAL "return redis.call(del, unpack(redis.call(keys…

有没有比较好用的网页3D应用程序在线编辑器?

问&#xff1a;three.js是当前主流的网页3d开发框架&#xff0c;但three.js的editor功能比较粗糙。国内有没有比较容易上手功能类似Unity3D的网页3D编辑软件&#xff0c;可以通过实体组件系统来完成程序扩展&#xff0c;简单拖拉拽完成3D场景、常用特效和用户交互的构建&#x…

【PYG】使用datalist定义数据集,创建一个包含多个Data对象的列表并使用DataLoader来加载这些数据

为了使用你提到的封装方式来创建一个包含多个 Data 对象的列表并使用 DataLoader 来加载这些数据&#xff0c;我们可以按照以下步骤进行&#xff1a; 创建数据&#xff1a;生成节点特征矩阵、边索引矩阵和标签。封装数据&#xff1a;使用 Data 对象将这些数据封装起来。使用 D…

PyQt5之理解和使用Python中的qasync:连接Qt和asyncio的桥梁

理解和使用Python中的qasync&#xff1a;连接Qt和asyncio的桥梁 在Python编程世界中&#xff0c;将图形用户界面&#xff08;GUI&#xff09;与异步编程结合起来可能是一项具有挑战性的任务。这就是qasync发挥作用的地方&#xff0c;它是一个Python库&#xff0c;用于桥接Qt&am…