Leetcode 2921. 价格递增的最大利润三元组 II

article/2025/8/18 19:31:21

1.题目基本信息

1.1.题目描述

给定长度为 n 的数组 prices 和 profits (下标从 0 开始)。一个商店有 n 个商品,第 i 个商品的价格为 prices[i],利润为 profits[i]。

需要选择三个商品,满足以下条件:

prices[i] < prices[j] < prices[k],其中 i < j < k。

  • 如果选择的商品 i, j 和 k 满足以下条件,那么利润将等于 profits[i] + profits[j] + profits[k]。

返回能够获得的 最大利润,如果不可能满足给定条件,返回 -1。

1.2.题目地址

https://leetcode.cn/problems/maximum-profitable-triplets-with-increasing-prices-ii/description/

2.解题方法

2.1.解题思路

树状数组 / 线段树

2.2.解题步骤

树状数组版本步骤

  • 第一步,构建两个树状数组,treeArr1维护左边更小价格对应利润的最大值,treeArr1维护右边更大价格对应利润的最大值

  • 第二步,使用树状数组,一边添加元素,一边计算单边最大值,构建larr和rarr数组,分别维护i处左边更小价格对应最大利润,i处右边更大价格对应的最大利润

  • 第三步,根据larr和rarr和profits数组提取题解

线段树版本步骤

  • 第一步,构建两个线段树,segTree1维护左边更小价格对应利润的最大值,segTree2维护右边更大价格对应利润的最大值

  • 第二步,使用线段树,一边添加元素,一边计算单边最大值,构建larr和rarr数组,分别维护i处左边更小价格对应最大利润,i处右边更大价格对应的最大利润

  • 第三步,根据larr和rarr和profits数组提取题解

3.解题代码

树状数组版本代码

# ==> 求区间最大值的树状数组(需要维护原数组)
class MaxTreeArr():def __init__(self, n:int):self.n = nself.nums = [-inf] * nself.arr = [-inf] * ndef lowerbit(self, x:int) -> int:return x & (-x)# > 更新原数组的index下标处的元素值为max(nums[index],val),并更新树状数组中index的祖先结点def update(self, index:int, val:int) -> None:# 注意:这个地方对原数组的更新,一定要取最大值,否则可能导致覆盖最大值导致错误(跳过坑)self.nums[index] = max(self.nums[index], val)while index < self.n:self.arr[index] = max(self.arr[index], val)index += self.lowerbit(index + 1)# > 查找arr闭区间[left,right]之间的最大值def queryMax(self, left:int, right:int) -> int:ans = -infindex = rightwhile index >= left:# l维护index维护的区间的左端点下标;如果l>=left,说明index维护的区间在[left,right]闭区间中,所以可以算最大值,反之,只能从原数组nums中选择,并将index自减1l = index - self.lowerbit(index + 1) + 1if l >= left:ans = max(ans, self.arr[index])index = l - 1else:ans = max(ans, self.nums[index])index -= 1return ansclass Solution:def maxProfit(self, prices: List[int], profits: List[int]) -> int:# 思路一:树状数组n = len(prices)maxPrice = max(prices)# 第一步,构建两个树状数组,treeArr1维护左边更小价格对应利润的最大值,treeArr1维护右边更大价格对应利润的最大值treeArr1 = MaxTreeArr(maxPrice + 1)treeArr2 = MaxTreeArr(maxPrice + 1)# 第二步,使用树状数组,一边添加元素,一边计算单边最大值,构建larr和rarr数组,分别维护i处左边更小价格对应最大利润,i处右边更大价格对应的最大利润larr = [-inf] * nfor i in range(n):leftMax = treeArr1.queryMax(0, prices[i] - 1)larr[i] = leftMaxtreeArr1.update(prices[i], profits[i])rarr = [-inf] * nfor j in range(n - 1, -1, -1):rightMax = treeArr2.queryMax(prices[j] + 1, maxPrice)rarr[j] = rightMaxtreeArr2.update(prices[j], profits[j])# 第三步,根据larr和rarr和profits数组提取题解result = -1for i in range(1, n - 1):if larr[i] + rarr[i] + profits[i] > result:result = max(result, larr[i] + rarr[i] + profits[i])return result

线段树版本代码

# ==> 线段树(维护区间最大值)
class MaxSegmentTree():def __init__(self, n:int):self.n = nself.arr = [-inf] * (4 * n)# 基础函数:修改原数组中的index下标处的元素为val,并更新线段树def change(self, index:int, val:int, node:int, start:int, end:int) -> None:# 第一步,递归退出条件。到达index对应的叶结点if index == start and index == end:# > 防止后面的小元素替换大元素,所以加max(根据具体的修改场景可能会有修改)self.arr[node] = max(self.arr[node], val)return# 第二步,根据mid判断index是在当前node的左子树还是右子树上,并进行递归修改mid = (end - start) // 2 + startif index <= mid:# > index在node左子树的情况self.change(index, val, 2 * node + 1, start, mid)else:# > index在node的右子树的情况self.change(index, val, 2 * node + 2, mid + 1, end)# 第三步,更新当前结点,根据当前结点更新后的左右结点,更新当前结点的最大值self.arr[node] = max(self.arr[2 * node + 1], self.arr[2 * node + 2])# 基础函数:求区间范围内的最大值def rangeMax(self, left:int, right:int, node:int, start:int, end:int) -> int:# 第一步,递归退出条件。当node区间和[left,right]闭区间完全匹配时,递归退出if left == start and right == end:return self.arr[node]# 第二步,递归子问题mid = (end - start) // 2 + startif right <= mid:# > [left,right]区间完全在node结点的左子树区间上return self.rangeMax(left, right, 2 * node + 1, start, mid)elif left > mid:# > [left,right]区间完全在node结点的右子树区间上return self.rangeMax(left, right, 2 * node + 2, mid + 1, end)# > [left,right]区间部分在node的左子树上,部分在右子树上的情况return max(self.rangeMax(left, mid, 2 * node + 1, start, mid), self.rangeMax(mid + 1, right, 2 * node + 2, mid + 1, end))# 封装changedef update(self, index:int, val:int) -> None:return self.change(index, val, 0, 0, self.n - 1)# 封装rangeMaxdef getRangeMax(self, left:int, right:int) -> int:# 注意:left>right时,会导致内存溢出return self.rangeMax(left, right, 0, 0, self.n - 1)class Solution:def maxProfit(self, prices: List[int], profits: List[int]) -> int:# 思路二:线段树n = len(prices)maxPrice = max(prices)segTree1 = MaxSegmentTree(maxPrice + 1)segTree2 = MaxSegmentTree(maxPrice + 1)# 构建larr和rarrlarr = [-inf] * nfor i in range(n):leftMax = segTree1.getRangeMax(0, prices[i] - 1)larr[i] = leftMaxsegTree1.update(prices[i], profits[i])# rarr = [-inf] * nfor j in range(n - 1, -1, -1):if prices[j] + 1 <= maxPrice:rightMax = segTree2.getRangeMax(prices[j] + 1, maxPrice)rarr[j] = rightMaxsegTree2.update(prices[j], profits[j])# 第三步,根据larr和rarr和profits数组提取题解result = -1for i in range(1, n - 1):if larr[i] + rarr[i] + profits[i] > result:result = max(result, larr[i] + rarr[i] + profits[i])print(larr, rarr, profits)return result

4.执行结果


http://www.hkcw.cn/article/SjiUQcxgIq.shtml

相关文章

电视剧《长安的荔枝》定档6月7日 雷佳音岳云鹏携手破局

古装传奇剧《长安的荔枝》由曹盾、高翔执导,马伯庸担任故事顾问,雷佳音和岳云鹏领衔主演,将于6月7日19:30在CCTV-8黄金强档播出,并在腾讯视频全网独播。此外,那尔那茜、安沺、吕凉、公磊、冯嘉怡、芦芳生、郭涛、韩童生、窦骁、张天爱、尹昉、明道等演员也将出演。该剧改编…

欧阳娜娜体验小鹏MONA M03 智能驾驶新标杆

5月28日晚,小鹏汽车在北京举办了MONA潮玩派对暨M03 Max新车上市发布会。会上,小鹏MONA M03升级亮相,并推出了四款全新版型,全球首发了人机共驾功能,官方指导价在11.98万至13.98万元之间。小鹏汽车董事长兼CEO何小鹏与车主欧阳娜娜现场互动,详细介绍了M03 Max的高阶智能辅…

女子托运行李丢失金手链 嫌疑人被拘 警方介入调查

杨女士乘坐春秋航空班机从西安回宁波时丢失了一条黄金手链。5月30日凌晨,她透露西安咸阳国际机场警方已抓获嫌疑人,她将前往西安协助警方办案。5月25日,杨女士乘坐春秋航空公司班机从西安返回宁波,到家后发现装在托运行李箱中的一条黄金手链丢失,而包装盒及箱子中的其他物…

燃气气瓶将迎“码上管理”阶段 国家标准护航安全

市场监管总局(国家标准委)发布了《燃气气瓶和燃气瓶阀溯源二维码应用技术规范》国家标准,该标准对民用燃气气瓶和瓶阀的质量信息追溯提出了全面要求,并将于2025年6月1日起实施。这项标准旨在解决当前燃气安全运行中存在的一些隐患,与《气瓶安全技术规程》相结合,提出了更…

DeepSeek: 我又强了!究竟是如何做到的呢?

DeepSeek:我又强了。你是否也曾梦想过工作效率翻倍,一天的工作五分钟搞定?DeepSeek升级后,用户纷纷感叹:“接入DeepSeek后,我又强了!”这款智能工具究竟是如何做到的呢?DeepSeek自上线以来,就凭借其强大的AI文档处理能力迅速走红网络。它不仅能帮助用户一键审核文档,…

保安谋划1个月偷走1亿元玉石 现实版《疯狂的石头》上演

新疆乌鲁木齐发生了一起现实版的《疯狂的石头》盗窃案。5月23日凌晨,某大厦玉石展厅内共计67块玉石被盗,受害人估价约1个亿。警方在现场勘查时发现门锁完好,但23楼窗户玻璃被砸,外侧有使用绳索的痕迹,27层平台也发现了绳索等物品及攀爬痕迹。调查揭示,这起案件的幕后黑手…

【Linux】揭秘Linux进程优先级与调度机制

8.进程优先级以及进程调度切换 文章目录 8.进程优先级以及进程调度切换一、进程优先级介绍查看进程的优先级PRI and NI查看进程优先级的命令 二、进程切换1. CPU 执行程序的过程2. 什么是上下文、为什么要保存、保存到哪3. 上下文保存和恢复的完整流程4. 多进程如何交替运行&am…

OSCP备战-SickOs1.2靶场详细步骤

一、靶机介绍 靶机基本信息&#xff1a; 靶机下载链接https://www.vulnhub.com/entry/sickos-12,144/作者D4rk发布日期2016年4月27日难度中等 二、信息搜集 记得将网络连接改成nat模式 1、 目标IP探测 目标IP&#xff1a;192.168.155.186 2、 端口扫描 nmap -p- --…

厦门花店老板制作艾草花束 端午文创成新宠

厦门花店老板制作艾草花束!商家用艾草搭配菖蒲、黄金球等绿植,用包装纸裹成花束。当厦门溪岸路花鸟市场的晨雾还未散去时,花店老板陈姐已熟练地将艾草、菖蒲、黄金球等捆扎成束,裹上包装纸,系上印有“端午安康”字样的丝质缎带。这些售价18元的“艾草花束”通过跑腿服务送…

17岁中学生从北坡登顶珠峰 创历史纪录

17岁中学生从北坡登顶珠峰!2025年5月25日上午6:39,17岁少年李浩榕成功从北坡登顶珠穆朗玛峰。他不仅是中国首位从北坡登顶珠峰的未成年男生,也是全球首位完成这一壮举的中学生。他来自北京市朝阳区第八十中学。从海拔5200米的珠峰大本营到8848.86米的顶峰,李浩榕和队友们经…

挂艾草的讲究 端午习俗门道多

挂艾草的讲究 端午习俗门道多!端午节即将到来,这是中华民族传承千年的传统节日,充满了浓厚的文化韵味。每逢此时,大街小巷都弥漫着节日的氛围,人们会吃粽子、赛龙舟,还有挂艾草这一重要习俗。艾草在民间被视为端午节的守护神,有着驱邪祈福的美好寓意。关于挂艾草有几点讲…

老板为困难人士提供免费小面 男子打领带连吃两天爱心小面顿顿吃两斤

近日,上海。上海面馆老板为困难人士提供免费重庆小面,一男子穿西服打领带围着围裙连蹭两天“爱心小面”,顿顿吃两斤多。老板:“我们也是农民,我们也很辛苦,你这样子我们也吃不消。”责任编辑:zx0002

大妈敲鼓扰民业主敲锣回击 物业劝阻无效引发对抗

大妈敲鼓扰民业主敲锣回击 物业劝阻无效引发对抗!5月29日,湖北仙桃风和日丽小区多名大妈占用小区凉亭,每到晚上就开始敲鼓,影响了居民的正常生活。业主们多次投诉无果后,无奈之下选择敲锣对抗。发布者称,这种现象已经持续了好几年,严重影响了孩子的学习和休息。物业表示…

16人投出21票?国际乒联发声明回应选举乌龙

当地时间5月27日,在国际乒联年度大会上,佩特拉索林以2票优势胜艾哈迈德哈利勒阿尔穆罕纳,索林将当选国际乒联主席。但现场参会人员发出质疑,在点名投票协会时线上数量为16人,但最终公布的线上票数出现了21人。因主席选举争议引发混乱,最终宣布临时暂停会议。5月30日,国际…

53岁男子诱骗近百名中小学女生被判刑

53岁男子诱骗近百名中小学女生被判刑!5月29日,江苏省人民检察院召开新闻发布会,介绍近年来加强未成年人网络司法保护的工作情况及典型案例。如皋市检察院副检察长卢海琴介绍了其中一例典型案例,该案,检察院通过深挖彻查,案件从1名被告人追到3名被告人、从1个罪名查到5个罪…

端午艾草花束火了 节日消费亮点纷呈

端午艾草花束火了!当街头巷尾飘起粽叶清香,艾草挂满千家万户的门楣时,我们即将迎来我国首个世界非遗节日——端午节。随着“粽子热”持续升温、艾草花束身价大涨,节日消费盛宴的大门正在开启,眼下消费市场呈现出诸多亮点。端午将至,粽叶飘香。多个平台数据显示,今年粽子…

苦尽甘来,小鹏稳了吗?

苦尽甘来,小鹏稳了吗?2025年,新势力车圈的竞争日渐白热化,继蔚来、零跑之后,小鹏汽车也立下了“Q4盈利”的flag。近日,小鹏汽车(以下简称“小鹏”)发布的2025年一季报,也印证了这份底气。根据财报,小鹏今年一季度营收同比激增141.5%至158.1亿元,毛利率攀升至15.6%,…

田径亚锦赛第三日:中国队1金2银3铜 冯彬铁饼夺金

第26届亚洲田径锦标赛在韩国龟尾市进行到了第三个比赛日,中国队当天共获得1金2银3铜的成绩。吴艳妮参加了女子100米栏比赛并夺得季军。她在预赛中以13秒07的成绩排名小组第二晋级决赛。决赛时,吴艳妮前半程紧随日本选手田中佑美,但后半程被印度选手亚拉吉反超,最终亚拉吉夺…

【笔记】2025 年 Windows 系统下 abu 量化交易库部署与适配指南

#工作记录 前言 在量化交易的学习探索中&#xff0c;偶然接触到 2017 年开源的 abu 量化交易库&#xff0c;其代码结构和思路对新手理解量化回测、指标分析等基础逻辑有一定参考价值。然而&#xff0c;当尝试在 2025 年的开发环境中部署这个久未更新的项目时&#xff0c;遇到…

4.1.2 操作数据集

在本实战中&#xff0c;我们深入学习了Spark SQL的操作数据集&#xff0c;包括了解Spark会话、准备数据文件、启动Spark Shell以及获取和操作学生数据集。通过Spark Shell&#xff0c;我们可以直接使用SparkSession实例来加载、转换和处理数据。我们学习了如何将文本文件加载为…