单调栈 LeetCode 1130. 叶值的最小代价生成树

ops/2024/9/20 9:21:36/ 标签: leetcode, 算法, 动态规划

目录

一、题目

1、题目描述

2、输入输出

2.1输入

2.2输出

3、原题链接

二、解题报告

1、思路分析

2、复杂度

3、代码详解


一、题目

1、题目描述

给你一个正整数数组 arr,考虑所有满足以下条件的二叉树:

  • 每个节点都有 0 个或是 2 个子节点。
  • 数组 arr 中的值与树的中序遍历中每个叶节点的值一一对应。
  • 每个非叶节点的值等于其左子树和右子树中叶节点的最大值的乘积。

在所有这样的二叉树中,返回每个非叶节点的值的最小可能总和。这个和的值是一个 32 位整数。

如果一个节点有 0 个子节点,那么该节点为叶节点。

2、接口

class Solution:

    def mctFromLeafValues(self, arr: List[int]) -> int:

3、原题链接

1130. Minimum Cost Tree From Leaf Values


二、解题报告

1、思路分析

先考虑贪心做法:小值尽量在下层,大值尽量在上层,那么我们每次选当前剩余结点两两相邻最大值中最小的两个进行合并,合并n - 1次即可,这样做堆优化的话是O(nlogn)

我们发现,对于一段单调递减的序列,我们一定是从右往左依次合并最优

如果出现了“波谷”,比如a[0, i] 单调递减,此时遇到了a[i + 1] >= a[i],我们发现此时对于a[0, i] 就不一定是从右往左更优了,因为出现了a[i + 1],但是对于a[i]而言,其一定是和a[i - 1] 和 a[i + 1]中小的那个合并最优,对于a[i - 1]类似

所以我们可以维护一个单调递减栈,如果栈顶小于等于当前x,我们将栈顶出栈,和新栈顶和x中大的那个合并,如此操作以维护单调栈的单调性

每次维护单调栈事实上只是完成了a[0, i + 1]的部分元素的合并操作,并且这些操作是最优操作,并且不影响后续的合并操作,因为我们左边的贡献是按照左边最大值来的,合并小的值不会影响右边合并对结果的贡献

2、复杂度

时间复杂度: O(N)空间复杂度:O(N)

3、代码详解

 ​
class Solution:def mctFromLeafValues(self, arr: list[int]) -> int:res = 0st = []for x in arr:while st and st[-1] <= x:t = st.pop()if not st or x < st[-1]:res += x * telse:res += st[-1] * tst.append(x)while len(st) > 1:t = st.pop()res += t * st[-1]return res


http://www.ppmy.cn/ops/100613.html

相关文章

论坛系统登录测试结果

目录 1 登录成功1.1 输入合法已注册手机号 2 登录失败2.1 输入未注册手机号2.2 输入非法手机号2.3 输入错误、过期验证码 论坛系统——部分测试用例 1 登录成功 1.1 输入合法已注册手机号 打开登录界面 输入已注册手机号 点击发送验证码 输入验证码&#xff0c;点击登录按钮 …

架构师面试题系列之Spring MVC面试专题及答案(31题)

目录 1、什么是 SpringMvc?说一下你对它的理解2、SpringMVC 的优点 :3、SpringMVC 工作原理?4、SpringMVC 的主要组件?5、讲下 SpringMvc 的执行流程6、SpingMvc 中的控制器的注解一般用那个,有没有别的注解可以替代?7、如果在拦截请求中,想拦截 get 方式提交的方法,怎么…

Python接口自动化测试:断言封装详解

在进行API接口测试时&#xff0c;断言起着至关重要的作用。断言是用于验证预期结果与实际结果是否一致的过程。在Python中&#xff0c;我们可以利用一些库来实现断言功能。 1. 安装必要的库 在Python中&#xff0c;我们主要会使用两个库&#xff1a;requests和jsonpath。requ…

解析阿里巴巴中国站商品详情API返回值的更新与变化

阿里巴巴中国站&#xff08;通常指的是1688.com&#xff0c;阿里巴巴的国内批发平台&#xff09;的商品详情API返回值可能会随着平台功能的更新、数据结构的调整或API版本的迭代而发生变化。为了准确解析这些更新与变化&#xff0c;你可以采取以下几个步骤&#xff1a; 1. 查阅…

2024焊工操作证考试在线模拟考试题

焊工证考试试题分为理论《焊工理论知识》考试和《焊工实操知识》专业能力考核。 焊工证考试试题理论知识考试采用闭卷电脑答题方式&#xff1b;理论知识考试和实操考核均实行百分制&#xff0c;焊工证考试成绩皆达80分及以上者为合格。 以下为焊工理论考试模拟试题&#xff0c…

apache httpclient速成

目录标题 快速使用连接池参数连接池状态清除闲置连接evictIdleConnections删除过期连接 timeToLive 和evictExpiredConnections 注意释放内存关闭流 http和netty的关系 导入依赖 <dependency><groupId>org.apache.httpcomponents.client5</groupId><artif…

QT通过信号传递参数至槽函数(不通层级通信)

传递参数参数多个&#xff0c;采用map&#xff0c;一直insert 前提&#xff0c; //map类型 typedef QMap <unsigned int , QByteArray> Map;//信号和槽的声明 signals:void sigToCems(InfoMap);void slotFromEms(Map Map);// 发射点&#xff1a;由事件触发 //Addr_EM…

龙旭 付玲云新歌推出原创歌曲热榜

盘点2024年8月全国受关注的经典热门歌曲你更爱那首&#xff1f; 歌曲1.《甜妹专属BGMentertainer》&#xff0c;2.情歌专属《尘世情缘》情歌唱给谁来听&#xff0c;3.巜迟来的情话》听完敢不敢留下你最想对TA说的话如果在18我没能送你花&#xff0c;那到28我请你喝酒吧&#x…

Linux驱动开发—设备模型框架 kobject创建属性文件

文章目录 什么是属性文件&#xff1f;1. sysfs 与 kobject2. 属性文件的作用3. 属性文件的基本操作4. 典型的属性文件用例5. 创建属性文件的步骤6.示例代码7.效果图 使用 ATTR 宏定义优化__ATTR用法解析1. __ATTR() 宏的定义2. __ATTR() 宏的参数3.优化示例 优化关键点解析1. 数…

Java与C#在中国:我们在信息技术领域的脆弱性和依赖性

2019年8月&#xff0c;微软公司宣布停止在俄罗斯销售新产品和服务&#xff0c;并暂停相关更新和授权。这一决定对俄罗斯用户和企业造成了不小的冲击。 2024年6月&#xff0c;微软陆续关闭中国线下门店授权。微软官方给出的回应是&#xff1a;为了满足客户不断变化的需求&#…

linux命令使用

vi可打开&#xff0c;可创建&#xff0c;cat只能打开已有的文件 rm -r 删除文件夹-r&#xff1a;这个选项代表“递归”&#xff08;recursive&#xff09;。当你用 -r 选项与 rm 一起使用时&#xff0c;rm 会递归地删除目录及其内容&#xff0c;包括所有子目录和文件。 pip i…

并行程序设计基础——MPI不连续数据发送(1)

目录 一、派生数据类型 二、定义新数据类型 1、连续复制的类型生成 2、向量数据类型的生成 3、索引数据类型的生成 4、结构数据类型的生成 5、新类型递交和释放 前面各节介绍的MPI程序设计都是发送或接收连续的数据,其实MPI还可以处理不连续的数据,基本方法有…

Linux 搜索历史命令Ctrl+R

最近使用CtrlR来搜索历史命令&#xff0c;对比速度比history 快一下&#xff0c;且看起来高级。记录如下&#xff1a;命令1&#xff1a;history 功能&#xff1a;显示当前Linux终端输入过的历史命令。案例&#xff1a;使用history 出来的结果很多&#xff0c;通常和grep 过滤&a…

如何根据域名选择合适的SSL证书

SSL证书是一种用于安全传输数据的数字证书。它通过加密数据&#xff0c;确保用户在与网站进行通信时信息得到保护。 有SSL证书和没有SSL证书证书的区别是什么&#xff1f; SSL证书配置前后比较直观的区别就是安全标识&#xff0c;SSL证书在浏览器地址栏显示一个小锁标志&#…

【Java】—— Java面向对象基础:定义圆类与通过对象传递参数

在Java编程中&#xff0c;我们可以创建多个类来组织和管理代码。在这个例子中&#xff0c;我们将创建一个Circle类和一个PassObject类。Circle类包含一个double型的radius属性和一个findArea()方法&#xff0c;用于计算圆的面积。PassObject类包含一个printAreas()方法&#xf…

Java 输入与输出之 NIO【非阻塞式IO】【NIO网络编程】探索之【二】

上一篇博客我们介绍了NIO的核心原理、FileChannel和Buffer, 对Buffer的用法有了清晰的了解。上篇博客&#xff1a; Java 输入与输出之 NIO【非阻塞式IO】【NIO核心原理】探索之【一】 本篇博客我们将继续来探索NIO&#xff0c;介绍如何使用SocketChannel和ServerSocketChannel来…

计算机毕业设计推荐-基于python的新能源汽车销售数据可视化分析【python-爬虫-大数据定制】

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、基于python的新能源汽车销售…

modbus协议举例(03功能码)

Modbus协议是一种广泛使用的通信协议&#xff0c;通常用于工业自动化和控制系统。以下是Modbus协议的一个简单示例&#xff0c;展示如何通过Modbus RTU进行数据读取。 示例场景 假设我们有一个Modbus从设备&#xff0c;其地址为1&#xff0c;支持读取保持寄存器。我们希望读取…

MVVM分层思想

M:Model数据模型 V:View视图 VM:ViewModel视图模型 Vue也是借鉴了MVVM的思想 在Vue中,M就是data,V指挂载点,而Vue实例本身就是一个VM <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X…

语言基础/单向链表的构建和使用(含Linux中SLIST的解析和使用)

文章目录 概述简单的链表描述链表的术语简单实现一个单链表 Linux之SLIST机理分析结构定义单链表初始化单链表插入元素单链表遍历元素单链表删除元素 Linux之SLIST使用实践纯C中typedef重命名带来的问题预留 概述 本文讲述了数据结构中单链表的基本概念&#xff0c;头指针、头…