动态规划之在二叉树中使用DP

2023-11-11

二叉树染色-题目描述


小扣有一个根结点为 root 的二叉树模型,初始所有结点均为白色,可以用蓝色染料给模型结点染色,模型的每个结点有一个 val 价值。小扣出于美观考虑,希望最后二叉树上每个蓝色相连部分的结点个数不能超过 k 个,求所有染成蓝色的结点价值总和最大是多少?
示例 1:

输入:root = [5,2,3,4], k = 2

输出:12

解释:结点 5、3、4 染成蓝色,获得最大的价值 5+3+4=12

image.png

示例 2:

输入:root = [4,1,3,9,null,null,2], k = 2

输出:16

解释:结点 4、3、9 染成蓝色,获得最大的价值 4+3+9=16

image.png

提示:

1 <= k <= 10
1 <= val <= 10000
1 <= 结点数量 <= 10000

详细思路

个人走的弯路(可略)

这道题也想了一段时间才做出来,最开始感觉是动态规划的思路,但是第一次在树结构中使用动态规划确实没有什么经验,想着会不会要先把树结构改变一下,例如做成邻接表

然后觉得这种做法也很麻烦,又想到会不会是是贪心算法呢,先选取树中最大的元素,依次考虑。发现如果这样做的话有需要进行并查集等操作,更重要的是这种思路是不是一定正确的,后来举例子反证了思路的错误

k为2

5,9,null,8,null,null,null,5

如果先选取最大的,是考虑9,8,但是明显5,9,5的组合更好

正确思路

最后花了几遍二叉树,经过思考,如果从底部往上开始,那么一个节点只需要考虑左右两个节点,那么也仅仅有如下几种情况
假如目前k=4

  1. 仅连接左节点,那么左节点有0,1,2三种情况,值分别为sum1,sum2,sum3那么父节点就对应有1,2,3,值分别为sum1+node.val,sum2+node.val,sum3+node.val
  2. 仅连接右节点,情况和上述一致,考虑的是子节点有0,1,2,3,4情况的话,父节点也不能连接超过
  3. 连接左右两个节点,那么就是对左节点和右节点情况的组合了,两个for循环遍历
  4. 两个子节点都不连接,那么此时的值为左右节点最大值之和!

我们在改节点设置一个长度为k+1的array数组,分别记录该节点已经连接了多少个
array1代表左节点数组,array2代表右节点数组

  1. 仅连接左节点 array[i+1]=array1[i]+array2[0]+node.val
  2. 仅连接右节点 array[i+1]=array2[i]+array1[0]+node.val
  3. 连接左右节点 array[i+j+1]=array1[i]+array2[j]+node.val
  4. 左右节点都不连接 array[0]=array1数组中最大值+ array2+数组中最大值

代码实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    int k;
    public int maxValue(TreeNode root, int k) {
        this.k=k;
        int[] array=Bfs(root);
        int max=0;
        for (int i = 0; i < array.length; i++) {
            max=Math.max(array[i],max);
        }
        return max;
    }


    public int[] Bfs(TreeNode node){
        if(node==null)return null;
        //获得左节点数组情况,其中数组下标代表该节点已经连接了i个节点,下标对应的值代表连接i个节点情况下最大价值和
        int[] array1=Bfs(node.left);
        //同上
        int[] array2=Bfs(node.right);
        /*
        1.仅连接左节点 array[i+1]=array1[i]+array2[0]+node.val
        2。仅连接右节点 array[i+1]=array2[i]+array1[0]+node.val
        3。连接左右节点 array[i+j+1]=array1[i]+array2[j]+node.val
        (第三种情况其实包含了1,2情况,因为i或j取0时候就是1,2情况)
        4。左右节点都不连接 array[0]=左右最大的值
         */
        int[] array=new int[k+1];
        int max=0;
        //如果左右节点都为空,那么array只有0和1两种情况,数组默认array[0]为0了
        if(array1==null&&array2==null){
            array[1]=node.val;
        }else if(array1==null){
            for (int i = 0; i < array2.length; i++) {
                max=Math.max(array2[i],max);
               if(i+1<array.length) array[i+1]=array2[i]+node.val;
            }
            array[0]=max;
        }else if(array2==null){
            for (int i = 0; i < array1.length; i++) {
                max=Math.max(array1[i],max);
                if(i+1<array.length) array[i+1]=array1[i]+node.val;
            }
            array[0]=max;
        }else {
            for (int i = 0; i < array1.length; i++) {
                for (int j = 0; j < array2.length; j++) {
                    max=Math.max(max,array1[i]+array2[j]);
                    if(i+j+1<array.length)array[i+j+1]=Math.max(array[i+j+1],array1[i]+array2[j]+node.val);
                }
            }
            array[0]=max;
        }
        return array;
    }

}

传送门

LCP 34. 二叉树染色

https://leetcode-cn.com/problems/er-cha-shu-ran-se-UGC/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态规划之在二叉树中使用DP 的相关文章

随机推荐

  • 面向对象基础2-关键字

    目录 前言 一 private关键字 二 private关键字的使用 三 this关键字 四 public关键字 五 protected 六 default 总结 前言 一 private关键字 private属于私有访问权限 用于修饰类的
  • ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type

    1 问题描述 ubuntu系统中安装好anaconda后 又继而安装了ROS 并通过命令 pip install opencv python 安装opencv的情况下 此时安装的opencv python包是存放在anaconda下的 而在
  • Linux中的一些指令及./详解

    在 Linux 中有许多常见的指令用于执行各种任务 以下是一些常见的 Linux 指令及其用法的总结 ls 列出目录中的文件和子目录 用法 ls 选项 目录 cd 改变当前工作目录 用法 cd 目录 pwd 显示当前工作目录的路径 用法 p
  • js逆向案例三

    目录 零 概述 一 请求参数 Cookie Referer校验 二 参数响应加密解密AES DES RSA 三 其它js混淆 1 案例7 百变ip eval 2 案例8 聚合图床 sojson v6 3 案例9 SH行政处罚 sojson
  • varest插件使用

  • 数据结构学习——顺序栈和链式栈的简单实现和解析(C语言版)

    数据结构 栈的简单解析和实现 一 概念 二 入栈 push 三 出栈 pop 四 顺序栈简单实现 1 进栈操作 2 出栈操作 一 概念 本篇所讲解的栈和队列属于逻辑结构上的划分 逻辑结构分为线性结构 非线性结构 线性结构 有且仅有一个开始节
  • GD32E230芯片无法识别

    GD32E230芯片无法识别 GD32E230板子回来后 开始接上jlink烧录 但是板子第一次能烧录然后第二次就不行的了 换了好几个板子都是 搞了好几个小时 整个人都快崩溃了 后面也是经过不断的尝试 终于搞好了 总结了一下 主要要注意的问
  • Qt的connect槽函数

    一 connect 函数的不同参数形式 以及其区别 优略 除2 未知 之外 总体分为三种形式 1 3信号和槽转为字符串形参的connect函数 4 5 6 7 8信号和槽转为可调用对象的connect函数 9转到槽函数 1 将信号连接到另一
  • 视觉算法工程师面试问题集锦,从基础到进阶,会介绍细节,持续更新中......

    引言 简历上写项目的流程 项目背景是什么 应用场景在什么地方 目的是什么 创造了什么价值 你做了什么事情 遇到困难时 又是怎么解决的 面试需要准备的内容 一 项目描述与项目细节提问 主要描述项目背景 项目实现的功能与方法流程等 面试官会针对
  • 基于STM32的OLED屏显示AHT20采集的温湿度数据

    文章目录 一 实现温湿度数据采集并通过串口显示 二 实现将温湿度采集数据显示到OLED屏 1 代码下载 2 部分代码的编写 3 编译并烧录 4 运行结果 三 小结 四 参考链接 本实验使用的工具 STM32野火mini开发板 AHT20温湿
  • mysql没有写入权限_解决Errcode: 13——mysql写文件权限问题

    mysql没有写入权限 解决Errcode 13 mysql写文件权限问题 一 问题 二 权限错误 Errcode 13 解决方法 三 原理 一 问题 在数据库中select into outfile home mysql data sql
  • Three.js入门之做一个简单的3D场景内添加标点的功能

    什么是Three js 百度百科上是这么说的 Three js是JavaScript编写的WebGL第三方库 提供了非常多的3D显示功能 运行在浏览器中的 3D 引擎 你可以用它创建各种三维场景 包括了摄影机 光影 材质等各种对象 你可以在
  • 数据结构第一次上机 第一章

    数据结构第一次上机 第一章 实验题2 常见算法时间函数的增长趋势分析 目的 理解常见算法时间函数的增长情况 内容 编写一个程序exp1 2 cpp 对于1 n的每个整数n 输出log2 n n Alt 41420出根号 n nlog2 n
  • 20050621:松一口气

    今天把业务日志的数据 恢复 上去了 不管怎么样 X姐放了一罐椰奶在我桌子上 我猜大概不会收到投诉了 因为这事情她也有责任 从某种意义上说是我帮她 摆平 了 但是下午X姐的本性又露出来了 不停的冒一些点子出来 客户总是这样 喜欢出些点子 并暗
  • ARTS挑战打卡第十周

    Algorithm 一周至少一道算法题 Review 阅读并点评至少一篇英文技术文章 Tip 学习至少一个技术技巧 总结和归纳在日常工作中所遇到的知识点 Share 分享一篇有观点和思考的技术文章 01 Algorthm https lee
  • 什么是面向对象

    面向对象 定义 面向对象 Object Oriented 是软件开发方法 一种编程范式 对象来自某一个类 同时又给类赋值而实例化 面向对象编程中执行一个功能的代码叫方法 method 举例 作为团队负责人 分管好各个部门的负责人就行 不需要
  • 【TensorFlow】激活函数(Activation Functions)原理解析(十二)

    神经网络结构的输出为所有输入的加权和 这导致整个神经网络是一个线性模型 如果将每一个神经元的输出通过一个非线性函数 那么整个神经网络的模型也就不再是线性的了 使得神经网络可以更好地解决较为复杂的问题 这个非线性函数也就是激活函数 神经网络中
  • elementUI一条el-form-item控制两个必填项

    实现效果 申请日期是日期跟时段拼接的
  • Qt 文件操作

    文件操作是应用程序必不可少的部分 Qt 作为一个通用开发库 提供了跨平台的文件操作能力 Qt5 新增加了一个QFileDevice类 途中所涉及的类及其用途简要说明如下 QFlie 访问本地文件或者嵌入资源 QTemporaryFile 创
  • 动态规划之在二叉树中使用DP

    二叉树染色 题目描述 文章目录 二叉树染色 题目描述 详细思路 个人走的弯路 可略 正确思路 代码实现 传送门 小扣有一个根结点为 root 的二叉树模型 初始所有结点均为白色 可以用蓝色染料给模型结点染色 模型的每个结点有一个 val 价