力扣337. 打家劫舍 III(java 动态规划)

Problem: 337. 打家劫舍 III

文章目录

  • 题目描述
  • 思路
  • 解题方法
  • 复杂度
  • Code

题目描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述

思路

1.构建多阶段决策模型:树形DP基于树这种数据结构上的推导,一般都是从上往下推,子节点状态推导父节点状态,一般都是基于后续遍历来实现。
2.定义状态:每个节点有两个状态;偷、不偷int moeny[2]表示每个节点的状态;money[0]表示选择不偷此节点,当下最大金额,money[1]表示选择偷此节点,当下最大金额。
3.定义状态转移方程:root.money[0] = max(left.money[0], left.money[1]) + max(right.money[0], right.money[1])即表示若当前节点选择不偷,则当前可以获得的最大金额为左右子节点的可偷或则不可偷的最大金额和;root.money[1] = left.money[0] + right.money[0] + root.val; 即表示若选择偷当前的节点则当前可以获得的最大金额为当前节点左右子节点均不偷可以获得的最大金额之和再加上当前偷取的金额

解题方法

1.编写并调用int[]类型函数postorder(将其赋值给一个int[]数组名为money)

1.1若当前节点为null则返回一个int数组;
1.2递归处理:依次递归处理左子节点偷取最大金额、右子节点偷取最大金额;
1.2递归处理操作:实现上述动态转移方程。

2.返回最终数组money中的较大值max(money[0], money[1])

复杂度

时间复杂度:

O ( n ) O(n) O(n);其中 n n n为二叉树的节点的个数

空间复杂度:

O ( l o g n ) O(logn) O(logn)

Code

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {/*** Get the maximum amount you can steal (tree DP)** @param root* @return int*/public int rob(TreeNode root) {int[] money = postorder(root);return Math.max(money[0], money[1]);}/*** The next iteration gets the maximum amount that can be stolen** @param root The root node of a binary tree* @return int[]*/private int[] postorder(TreeNode root) {if (root == null) {return new int[]{0, 0};}int[] leftMoney = postorder(root.left);int[] rightMoney = postorder(root.right);int[] money = new int[2];money[0] = Math.max(leftMoney[0], leftMoney[1]) + Math.max(rightMoney[0], rightMoney[1]);money[1] = (leftMoney[0] + rightMoney[0]) + root.val;return money;}
}

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

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

相关文章

015集:进程与线程:多线程运行实例—python基础入门实例

1、进程:我们可以理解为是一个可以独立运行的程序单位。 比如:打开一个浏览器,这就开启了一个浏览器进程;打开一个文本编辑器,这就开启了一个文本编辑器进程。但一个进程中是可以同时处理很多事情的。 比如&#xff1…

vue选项式API和组合式Api

组合式 API 和选项式 API 是 Vue.js 提供的两种不同的 API。组合式 API 更加灵活&#xff0c;在处理复杂场景时更有效&#xff0c;而选项式 API 则更易于入门和使用&#xff0c;适合处理简单的场景。下面是组合式 API 和选项式 API 的一个比较&#xff1a; 组合式 API <te…

“一键批量处理:轻松缩小图片像素,提升工作效率“

"在忙碌的工作中&#xff0c;时间就是金钱。使用我们的图片批量处理工具&#xff0c;轻松缩小图片像素&#xff0c;让您的工作更加高效。一键操作&#xff0c;告别繁琐&#xff0c;让您有更多时间享受生活。高效工作&#xff0c;从这里开始&#xff01;" 第一步&…

postman 简单测试(一)

1.postman官网 Postman API Platform 2.研究了一下postman 一些简单的功能&#xff0c;自己做个记录&#xff0c;同时希望能节约点测试时间。 2.1新建一个 collections 长期测的话&#xff0c;最好注册一个账号&#xff0c;开放更多功能。 2.2新建一个请求 后端要先搭建起来…

ModuleNotFoundError: No module named ‘SwissArmyTransformer‘

小问题&#xff0c;直接pip install pip install SwissArmyTransformer 但是&#xff0c;安装之后却还是提示&#xff0c;屏幕上依然标红 ModuleNotFoundError: No module named SwissArmyTransformer 查找环境目录发现&#xff0c; 这是因为新版的SwissArmyTransformer中&…

2024年四川省众创空间和科技企业孵化器申报条件及各区县奖励补助

一、四川省各地市众创空间、科技企业孵化器奖励补贴 对新建的国家和省级科技企业孵化器&#xff08;含改扩建&#xff09;和大学科技园给予不超过100万元的奖励性后补助&#xff1b; 对新建的国家和省众创空间、国家专业化众创空间给予不超过50万元的奖励性后补助。强化孵化器…

关键信息基础设施安全相关材料汇总

文章目录 前言一、法律(1)《中华人民共和国国家安全法》(2)《中华人民共和国网络安全法》(3) 《中华人民共和国密码法》(4)《中华人民共和国数据安全法》(5) 《中华人民共和国个人信息保护法》二、行政法规(6)《中华人民共和国保守国家秘密法实施条例》(7) 《关键信息基础设施安…

AI嵌入式K210项目(6)-开启双核模式

文章目录 前言一、K210双核心和BSP介绍二、实验过程代码实现 总结 前言 前面我们在介绍K210时提及到&#xff0c;K210芯片中有两个RISC-V核心&#xff0c;一般情况下&#xff0c;只有一个核心在运行&#xff0c;本章将介绍如何开启双核模式。 一、K210双核心和BSP介绍 K210系…

CXYGZL-程序员工作流,持续迭代升级中

概述 现在开源的工作流引擎&#xff0c;基本都是以BPMN.js为基础的&#xff0c;导致使用门槛过高&#xff0c;非专业人员无法驾驭。本工作流借鉴钉钉/飞书的方式&#xff0c;以低代码方式降低用户使用门槛&#xff0c;即使是普通企业用户也可以几分钟内就能搭建自己的工作流引…

CC工具箱使用指南:【获取所有字段信息】

一、简介 这个工具的目的简单易懂&#xff0c;就是获取选定要素图层的所有字段信息。 本身不对要素图层作任何处理&#xff0c;只是一个查看属性的工具。 问我要用在什么地方&#xff0c;我也不知道-_- 二、工具参数介绍 点击【信息获取】组里的【获取所有字段信息】工具&a…

Vue3中使用自定义指令

一&#xff0c;自定义指令&#xff1a; 应用场景&#xff1a;禁用按钮多次点击 1.vue2 a. src/libs/preventClick.js import Vue from vue const preventClick Vue.directive(preventClick, {inserted: function (el, binding) {el.addEventListener(click, () > {if (!el…

网络协议与攻击模拟_04ICMP协议与ICMP重定向

ICMP协议是网络层协议&#xff0c; 利用ICMP协议可以实现网络中监听服务和拒绝服务&#xff0c;如 ICMP重定向的攻击。 一、ICMP基本概念 1、ICMP协议 ICMP是Internet控制报文协议&#xff0c;用于在IP主机、路由器之间传递控制消息&#xff0c;控制消息指网络通不通、主机是…

windows系统下docker软件中使用ubuntu发行版本的linux系统

1.软件下载 官网下载地址 下载安装之后&#xff0c;再去微软商店下载wsl软件&#xff0c;可以直接用&#xff0c;或者也可以使用命令行拉取&#xff08;下面会讲&#xff09; 2.在docker里面创建容器的两种方法 2.1.命令行创建 前言&#xff1a;输入 winr 打开命令行进行下面…

【经典算法】有趣的算法之---遗传算法梳理

every blog every motto: You can do more than you think. 0. 前言 遗传算法是一种基于自然选择和遗传机制的优化算法&#xff0c;因此它通常被用于求解各种最优化问题&#xff0c;例如函数优化、特征选择、图像处理等。 一言以蔽之&#xff1a; 将数学中的优化问题&#xf…

Rust 基础语法

本章主要了解可变变量、不可变变量、函数、基本类型、注释、所有权、借用。 1、定义变量&#xff0c;Rust中有可变变量和不可变变量的区别&#xff0c;不废话上代码 fn main() {//创建一个不可变的变量xlet x5;//创建一个可变的变量ylet mut y6;x10;y11;//打印变量x、y的值pr…

pythonnumpy十二: 使用numpy完成图像处理

使用NumPy可以进行简单的图像处理操作&#xff0c;例如调整图像大小、裁剪图像、旋转图像、改变图像亮度等。下面是一些示例&#xff1a; 1.调整图像大小&#xff1a; import numpy as np from PIL import Image# 打开图像 image Image.open(image.jpg)# 调整图像大小 new_s…

高级分布式系统目录汇总

临近《高级分布式系统》考试&#xff0c;所以一边复习((⊙o⊙)…&#xff0c;其实是预习&#xff0c;哈哈^_^)&#xff0c;一边写高级分布式博客。先将高级分布式章节以及相关博客罗列如下&#xff0c;欢迎和大家一起学习。资料部分参考上了以下教材&#xff1a; 分布式实时系统…

超形象图解Python NumPy

超形象图解Python NumPy&#xff01;

邦芒支招:三招教你迅速度过职场迷茫期

在职场与同事相处的时间要多过家人&#xff0c;处理不好职场中同事间的关系&#xff0c;每一天都在不开心中度过。 ​ ​职场新人最难处理的并不是工作&#xff0c;而是职场关系&#xff0c;即使很多职场老司机也未必把握得当&#xff0c;反而成为很多职场上的失败案例。 尽管…

接口interface--java学习笔记

认识接口 java提供了一个关键字interface&#xff0c;用这个关键字可以定义出一个特殊的结构&#xff1a;接口在接口里面定义的变量&#xff0c;不管加不加public static final修饰都默认为常量&#xff0c;必须赋初值在接口里面定义的方法&#xff0c;不管加不加public abstr…