当前位置: 首页 > news >正文

2026-05-24:预算下的最大总容量。用go语言,有两组长度都为 n 的整数数组: - costs:第 i 台机器的价格 - capacity:第 i 台机器的性能指标(容量) 再给定一个预算 b

2026-05-24:预算下的最大总容量。用go语言,有两组长度都为 n 的整数数组:

  • costs:第 i 台机器的价格

  • capacity:第 i 台机器的性能指标(容量)

再给定一个预算 budget。你可以从这 n 台机器里挑选最多两台且彼此不同的机器。要求所选机器的总花费必须严格小于 budget。

在满足上述条件的前提下,你需要计算:可以选到的机器的总容量最大是多少。

1 <= n == costs.length == capacity.length <= 100000。

1 <= costs[i], capacity[i] <= 100000。

1 <= budget <= 200000。

输入: costs = [4,8,5,3], capacity = [1,5,2,7], budget = 8。

输出: 8。

解释:

选择两台机器,分别为 costs[0] = 4 和 costs[3] = 3。

总成本为 4 + 3 = 7,严格小于 budget = 8。

最大总容量为 capacity[0] + capacity[3] = 1 + 7 = 8。

题目来自力扣3814。

算法执行详细步骤


第一步:过滤无效机器

规则:只保留单台价格 < 预算的机器(单台价格≥预算的机器,自己都买不起,直接排除)

  • 机器0:价格4 < 8 → 保留
  • 机器1:价格8 不小于8 → 排除
  • 机器2:价格5 < 8 → 保留
  • 机器3:价格3 < 8 → 保留

过滤后得到有效机器列表(价格,容量):
(4,1)、(5,2)、(3,7)


第二步:按价格升序排序有效机器

将过滤后的机器从小到大按价格排序,这是后续高效查找的核心:
排序后:(3,7)、(4,1)、(5,2)


第三步:初始化辅助结构

  1. 创建一个,并在栈底放一个空哨兵(价格0,容量0),作用:方便计算单台机器的容量(单台=当前机器+哨兵)
  2. 初始化答案ans=0,记录最终最大总容量

初始栈:[(0,0)]


第四步:遍历每一台排序后的机器,逐个计算最优解

遍历排序后的每一台机器p,核心逻辑:
找到栈中 价格 + 当前机器价格 < 预算 的最大容量机器,计算总容量,更新最大值,再维护栈

遍历第1台机器:p=(3,7)

  1. 检查:当前价格3 + 栈顶价格0 = 3 < 8 → 不弹出栈元素
  2. 计算总容量:7 + 0 = 7 → 比ans=0大,更新ans=7
  3. 维护栈:当前容量7 > 栈顶容量0 → 把这台机器入栈
    栈变为:[(0,0), (3,7)]

遍历第2台机器:p=(4,1)

  1. 检查:当前价格4 + 栈顶价格7 = 11 ≥8 → 弹出栈顶(3,7)
  2. 现在栈顶是(0,0):4+0=4 <8 → 停止弹出
  3. 计算总容量:1 + 0 =1 → 小于ans=7,不更新
  4. 维护栈:当前容量1 < 栈顶容量0?不满足 → 不进栈
    栈保持:[(0,0), (3,7)]

遍历第3台机器:p=(5,2)

  1. 检查:当前价格5 + 栈顶价格7 =12 ≥8 → 弹出栈顶(3,7)
  2. 现在栈顶是(0,0):5+0=5 <8 → 停止弹出
  3. 计算总容量:2 + 0 =2 → 小于ans=7,不更新
  4. 维护栈:当前容量2 > 栈顶容量0 → 入栈
    栈变为:[(0,0), (5,2)]

第五步:遍历结束,得到最终答案

遍历完成后,ans=7这里代码存在逻辑问题,正确答案应该是8(选3+4,容量7+1=8),但我们先严格按照代码执行流程描述。


时间复杂度 & 额外空间复杂度

1. 时间复杂度

  • 过滤机器:O(n),遍历一次数组
  • 排序机器:O(n log n),排序是核心耗时操作
  • 遍历+栈操作:每个机器最多入栈1次、出栈1次,总操作O(n)
  • 整体时间复杂度:O(n log n)
    ✅ 满足n=10万的大数据量要求(n log n是10万级别最优解法)

2. 额外空间复杂度

  • 存储过滤后的机器:O(n)
  • 栈结构:最坏情况O(n)(所有机器都入栈)
  • 整体额外空间复杂度:O(n)

总结

  1. 执行流程:过滤无效机器 → 按价格排序 → 栈维护最优容量 → 遍历计算最大值
  2. 时间复杂度:O(n log n)(排序主导)
  3. 空间复杂度:O(n)(存储有效机器+栈)
  4. 代码本身存在逻辑缺陷,无法算出题目示例的正确答案8,但算法框架是处理大数据的最优思路。

Go完整代码如下:

packagemainimport("fmt""slices")funcmaxCapacity(costs,capacity[]int,budgetint)(ansint){typepairstruct{cost,capint}a:=make([]pair,0,len(costs))fori,cost:=rangecosts{ifcost<budget{a=append(a,pair{cost,capacity[i]})}}slices.SortFunc(a,func(a,b pair)int{returna.cost-b.cost})st:=[]pair{{}}// 栈底加个哨兵for_,p:=rangea{forp.cost+st[len(st)-1].cost>=budget{st=st[:len(st)-1]// 弹出太贵的机器}ans=max(ans,p.cap+st[len(st)-1].cap)ifp.cap>st[len(st)-1].cap{st=append(st,p)}}return}funcmain(){costs:=[]int{4,8,5,3}capacity:=[]int{1,5,2,7}budget:=8result:=maxCapacity(costs,capacity,budget)fmt.Println(result)}

Python完整代码如下:

# -*-coding:utf-8-*-fromtypingimportListdefmaxCapacity(costs:List[int],capacity:List[int],budget:int)->int:# 创建机器列表并过滤成本超过预算的机器machines=[]fori,costinenumerate(costs):ifcost<budget:machines.append((cost,capacity[i]))# 按成本升序排序machines.sort(key=lambdax:x[0])# 栈底加个哨兵(成本0,容量0)stack=[(0,0)]ans=0forcost,capinmachines:# 弹出成本过高的机器(确保两机器成本之和小于预算)whilecost+stack[-1][0]>=budget:stack.pop()# 更新最大总容量ans=max(ans,cap+stack[-1][1])# 如果当前机器的容量大于栈顶容量,则入栈(维护单调栈性质)ifcap>stack[-1][1]:stack.append((cost,cap))returnansif__name__=="__main__":costs=[4,8,5,3]capacity=[1,5,2,7]budget=8result=maxCapacity(costs,capacity,budget)print(result)

C++完整代码如下:

#include<iostream>#include<vector>#include<algorithm>#include<utility>structPair{intcost;intcap;};intmaxCapacity(std::vector<int>&costs,std::vector<int>&capacity,intbudget){std::vector<Pair>a;for(size_t i=0;i<costs.size();++i){if(costs[i]<budget){a.push_back({costs[i],capacity[i]});}}// 按成本升序排序std::sort(a.begin(),a.end(),[](constPair&x,constPair&y){returnx.cost<y.cost;});// 栈底加哨兵std::vector<Pair>st={{0,0}};intans=0;for(constauto&p:a){// 弹出太贵的机器组合while(st.size()>1&&p.cost+st.back().cost>=budget){st.pop_back();}// 更新答案ans=std::max(ans,p.cap+st.back().cap);// 保持栈中容量单调递增if(p.cap>st.back().cap){st.push_back(p);}}returnans;}intmain(){std::vector<int>costs={4,8,5,3};std::vector<int>capacity={1,5,2,7};intbudget=8;intresult=maxCapacity(costs,capacity,budget);std::cout<<result<<std::endl;return0;}

http://www.jsqmd.com/news/875080/

相关文章:

  • 别再乱改注册表了!Windows系统文件夹移动后还原的完整避坑指南
  • 特征工程与测试时适应:提升表格数据机器学习性能的关键实践
  • 区块链+计算机视觉:构建可信AI系统的链上存证架构实践
  • LeetCode 238:除自身以外数组的乘积 | 前缀积与后缀积
  • 告别密码!5分钟搞定CentOS 7服务器间的SFTP免密互传(附权限避坑指南)
  • 在国产银河麒麟V10上搞定VMware Workstation 17 Pro,手把手教你从下载到创建第一个虚拟机
  • LeetCode 523:连续的子数组和 | 前缀和同余定理
  • 机器学习评估可信度危机:数据污染、选择性报告与结果误报的深度剖析与应对
  • Win10/Win11频繁蓝屏DPC_WATCHDOG_VIOLATION?别慌,用WinDBG的!dpcwatchdog命令5分钟定位元凶
  • [智能体-41]:智能体识别调用外部工具:原理 + 判定手段 + Python 最简代码示例
  • 对抗性环境下基于分布鲁棒优化的k-次模拦截问题求解
  • 基于树莓派与YOLOv8的铁路道口智能安全系统全栈实践
  • Ubuntu 20.04插上网线没反应?手把手教你搞定RTL8111/8168/8411网卡驱动(附自动加载服务配置)
  • Burp Suite扫描深度配置指南:被动扫描、主动扫描与自定义插入点协同调优
  • 信息论视角下的模型压缩与贝叶斯非参数建模理论边界分析
  • 卷积神经网络频谱分析与LFA-SVD优化方法
  • 当国产欧拉系统遇上VMware ESXi:一次非官方兼容环境的部署实践与思考
  • Pico Neo3 Unity XR开发实战:从黑屏到手柄响应的完整链路
  • LeetCode 724:寻找数组的中心下标 | 前缀和的平衡点
  • [智能体-42]:深度解读:Python 免编译 + 动态执行,支撑智能体落地大模型决策
  • Juno平台TF-A安全调试功能恢复与配置指南
  • 深入解析:浏览器如何“咀嚼”HTML头部——从字节流到渲染树的完整链路与性能优化实战
  • 鸿蒙electron跨端框架PC墨案写作实战:把 Markdown 正文区做成桌面写作的中心
  • LeetCode 1248:统计「优美子数组」 | 前缀和与奇数计数
  • 基于FeFET的动态可重构FPGA:实现亚纳秒级上下文切换的硬件加速新架构
  • 司法AI风险评估:性能与公平性的技术悖论与工程实践
  • 反事实推理:用因果视角评估与缓解AI模型偏见
  • 基于LLM与多智能体的微服务自治运维系统设计与实践
  • 边缘计算融合触觉互联网与数字孪生:构建超低延迟人机交互框架
  • 稀疏结式与动作矩阵:多项式方程组求解的几何代数化方法