leetcode笔记-House Robber

2023-12-21 15:32
文章标签 leetcode 笔记 house robber

本文主要是介绍leetcode笔记-House Robber,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.给定一个数组,相邻的两个数不能取,从头到尾能取到的和的最大值?

思路:动态规划

           dp[i]=max(dp[i-1],dp[i-2]+nums[i])
           dp[0]=nums[0];dp[1]=max(nums[0],nums[1])

          

class Solution {//动态规划dp[i]=max(dp[i-1],dp[i-2]+nums[i])//dp[0]=nums[0];dp[1]=max(nums[0],nums[1])
public:int rob(vector<int>& nums) {vector<int> dp;if(nums.size()==0) return 0;if(nums.size()==1) return nums[0];if(nums.size()==2) return max(nums[0],nums[1]);dp={nums[0],max(nums[0],nums[1])};for(int i=2;i<nums.size();i++){dp.push_back(max(dp[i-1],dp[i-2]+nums[i]));}return dp.back();}
};

2.头连着尾?

思路:动态规划(分两种情况,一个是从第二家开始到最后一家,另一个是从第一家开始到最后一家)

           dp[i]=max(dp[i-1],dp[i-2]+nums[i])
           dp[0]=nums[0];dp[1]=max(nums[0],nums[1])


<span style="font-family:Times New Roman;">c<span style="font-size:18px;">lass Solution {
public:int rob(vector<int>& nums) {if(nums.size()==0) return 0;if(nums.size()==1) return nums[0];if(nums.size()==2) return max(nums[0],nums[1]);if(nums.size()==3) return max(nums[0],max(nums[1],nums[2]));vector<int> dp={nums[0], max(nums[0],nums[1])};//从第一个家到倒数第二家for(int i=2;i<nums.size()-1;i++){dp.push_back(max(dp[i-1],dp[i-2]+nums[i]));}vector<int> dp1={0,nums[1], max(nums[1],nums[2]),}; //从第二家到最后一家for(int i=3;i<nums.size();i++){dp1.push_back(max(dp1[i-1],dp1[i-2]+nums[i]));}return max(dp.back(),dp1.back());}
};</span></span>


3.给定一个树,相邻的节点不能取,能取到的和的最大值?

思路1:深度优先遍历二叉树,每次遍历返回两个值:分别表示偷窃或者不偷窃当前节点可以获得的最大收益。cur and pre

后序遍历

/**
* Definition for a binary tree node.
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int rob(TreeNode* root) {
if(root==NULL)
return 0;
dfs(root);
return max(dp1[root],dp2[root]);
}
void dfs(TreeNode* node){
if(node==NULL)
return;
dfs(node->left);
dfs(node->right);//实际干活的代码写在这两个递归之后,
//表示先处理一个节点的左右子树之后,才考虑本身节点(后序遍历处理手法)
dp1[node]=dp2[node->left]+dp2[node->right]+node->val;
//dp2[NULL]是等于0的,当前节点被盗时,其左右子节点都不能被盗
dp2[node]=max(max(dp1[node->left]+dp1[node->right],dp2[node->left]+dp2[node->right]),max(dp1[node->left]+dp2[node->right],dp1[node->right]+dp2[node->left]));//当前节点不被盗时,取其左右节点都被盗、左右节点都不被盗、左节点被盗有节点不被盗、左节点被盗右节点不被盗中最大的一个值
}
private:
map<TreeNode*,int> dp1; //当前节点被盗,
map<TreeNode*,int> dp2;//当前节点不被盗
};


这篇关于leetcode笔记-House Robber的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/520527

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2