网易首页 > 网易号 > 正文 申请入驻

2026-05-24:预算下的最大总容量。用go语言,有两组长度都为 n 的整数数组: - costs:第 i 台机器的价格 - capacity:第 ...

0
分享至

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. 1. 创建一个,并在栈底放一个空哨兵(价格0,容量0),作用:方便计算单台机器的容量(单台=当前机器+哨兵)

  2. 2. 初始化答案ans=0,记录最终最大总容量

初始栈:[(0,0)]

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

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

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

  1. 1. 检查:当前价格3 + 栈顶价格0 = 3 < 8 → 不弹出栈元素

  2. 2. 计算总容量:7 + 0 = 7 → 比ans=0大,更新ans=7

  3. 3. 维护栈:当前容量7 > 栈顶容量0 → 把这台机器入栈
    栈变为:[(0,0), (3,7)]

遍历第2台机器:p=(4,1)
  1. 1. 检查:当前价格4 + 栈顶价格7 = 11 ≥8 → 弹出栈顶(3,7)

  2. 2. 现在栈顶是(0,0):4+0=4 <8 → 停止弹出

  3. 3. 计算总容量:1 + 0 =1 → 小于ans=7,不更新

  4. 4. 维护栈:当前容量1 < 栈顶容量0?不满足 → 不进栈
    栈保持:[(0,0), (3,7)]

遍历第3台机器:p=(5,2)
  1. 1. 检查:当前价格5 + 栈顶价格7 =12 ≥8 → 弹出栈顶(3,7)

  2. 2. 现在栈顶是(0,0):5+0=5 <8 → 停止弹出

  3. 3. 计算总容量:2 + 0 =2 → 小于ans=7,不更新

  4. 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. 1. 执行流程:过滤无效机器 → 按价格排序 → 栈维护最优容量 → 遍历计算最大值

  2. 2. 时间复杂度:O(n log n)(排序主导)

  3. 3. 空间复杂度:O(n)(存储有效机器+栈)

  4. 4. 代码本身存在逻辑缺陷,无法算出题目示例的正确答案8,但算法框架是处理大数据的最优思路。

Go完整代码如下:

package main

import (
"fmt"
"slices"
)

func maxCapacity(costs, capacity []int, budget int) (ans int) {
type pair struct{ cost, capint }
a := make([]pair, 0, len(costs))
for i, cost := range costs {
if cost < budget {
a = append(a, pair{cost, capacity[i]})
}
}
slices.SortFunc(a, func(a, b pair)int { return a.cost - b.cost })

st := []pair{{}} // 栈底加个哨兵
for _, p := range a {
for p.cost+st[len(st)-1].cost >= budget {
st = st[:len(st)-1] // 弹出太贵的机器
}
ans = max(ans, p.cap+st[len(st)-1].cap)
if p.cap > st[len(st)-1].cap {
st = append(st, p)
}
}
return
}

func main() {
costs := []int{4, 8, 5, 3}
capacity := []int{1, 5, 2, 7}
budget := 8
result := maxCapacity(costs, capacity, budget)
fmt.Println(result)
}

Python完整代码如下:

# -*-coding:utf-8-*-

from typing import List

def maxCapacity(costs: List[int], capacity: List[int], budget: int) -> int:
# 创建机器列表并过滤成本超过预算的机器
machines = []
for i, cost in enumerate(costs):
if cost < budget:
machines.append((cost, capacity[i]))
# 按成本升序排序
machines.sort(key=lambda x: x[0])
# 栈底加个哨兵(成本0,容量0)
stack = [(0, 0)]
ans = 0
for cost, cap in machines:
# 弹出成本过高的机器(确保两机器成本之和小于预算)
while cost + stack[-1][0] >= budget:
stack.pop()
# 更新最大总容量
ans = max(ans, cap + stack[-1][1])
# 如果当前机器的容量大于栈顶容量,则入栈(维护单调栈性质)
ifcap > stack[-1][1]:
stack.append((cost, cap))
return ans

if __name__ == "__main__":
costs = [4, 8, 5, 3]
capacity = [1, 5, 2, 7]
budget = 8
result = maxCapacity(costs, capacity, budget)
print(result)

C++完整代码如下:

  




struct Pair {
int cost;
intcap;
};

int maxCapacity(std::vector& costs, std::vector& capacity, int budget) {
std::vector 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(), [](const Pair& x, const Pair& y) {
return x.cost < y.cost;
});

// 栈底加哨兵
std::vector st = {{ 0, 0}};
int ans = 0;

for (const auto& 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);
}
}
return ans;
}

int main() {
std::vector costs = {4, 8, 5, 3};
std::vector capacity = {1, 5, 2, 7};
int budget = 8;
int result = maxCapacity(costs, capacity, budget);
std::cout << result << std::endl;
return0;
}
在这里插入图片描述

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
央企及各地正陆续部署新一轮国企改革,战略性重组与新兴产业布局将成为两大主线

央企及各地正陆续部署新一轮国企改革,战略性重组与新兴产业布局将成为两大主线

澎湃新闻
2026-06-01 06:45:16
浏阳市委书记调整,安全是发展的基石

浏阳市委书记调整,安全是发展的基石

星空区块链
2026-05-31 21:23:58
武契奇公开证实,中国超音速导弹摧毁了俄制S-400防空导弹系统!

武契奇公开证实,中国超音速导弹摧毁了俄制S-400防空导弹系统!

阿龙聊军事
2026-05-30 16:58:30
如果中国继续在俄乌冲突中中立,俄罗斯可能要 “重新考虑方向”

如果中国继续在俄乌冲突中中立,俄罗斯可能要 “重新考虑方向”

回京历史梦
2026-05-29 18:32:40
主角:晚年瘫痪截肢的刘红兵,离婚丧子父母不认,却一生有情有义

主角:晚年瘫痪截肢的刘红兵,离婚丧子父母不认,却一生有情有义

容妃
2026-05-25 15:44:15
最大的铁饭碗要碎了吗:转岗、超编、过剩......

最大的铁饭碗要碎了吗:转岗、超编、过剩......

黯泉
2026-05-29 15:10:09
粮食变革:专家在陕西发现的三株植物,改变了新一轮的粮食格局

粮食变革:专家在陕西发现的三株植物,改变了新一轮的粮食格局

森罗万象视频
2026-04-16 21:18:48
为什么去过朝鲜回来就沉默的人,不是隐瞒,是真的说不出

为什么去过朝鲜回来就沉默的人,不是隐瞒,是真的说不出

老特有话说
2026-05-12 15:41:08
杨鸣:历史上确实没有0-3落后翻盘的先例,但广厦不能丧失信心

杨鸣:历史上确实没有0-3落后翻盘的先例,但广厦不能丧失信心

懂球帝
2026-05-31 23:05:37
越来越多人死守油车不肯换电车 而是算清了3笔实在账 看完恍然大悟

越来越多人死守油车不肯换电车 而是算清了3笔实在账 看完恍然大悟

生活魔术专家
2026-05-31 16:49:29
稳中求进每月看|稳舵扬帆正当时——5月全国各地经济社会发展观察

稳中求进每月看|稳舵扬帆正当时——5月全国各地经济社会发展观察

新华社
2026-05-31 10:35:15
斯坦丘:赛后心情复杂,但仍为球队上半程取得的成绩感到骄傲

斯坦丘:赛后心情复杂,但仍为球队上半程取得的成绩感到骄傲

懂球帝
2026-06-01 00:30:29
对方自称领导秘书!一老板花5800万“跑关系”,不认栽报警!深圳法院:上缴国库

对方自称领导秘书!一老板花5800万“跑关系”,不认栽报警!深圳法院:上缴国库

南方都市报
2026-05-31 19:49:45
最怂的战术,最软的脚:阿尔特塔,你怎么能让中后卫踢最后一球?

最怂的战术,最软的脚:阿尔特塔,你怎么能让中后卫踢最后一球?

林子说事
2026-05-31 21:39:15
74岁老人烧杨絮引燃20辆汽车:起因是认为大量杨絮影响其健身走步,因涉嫌失火罪,被采取刑事强制措施

74岁老人烧杨絮引燃20辆汽车:起因是认为大量杨絮影响其健身走步,因涉嫌失火罪,被采取刑事强制措施

极目新闻
2026-05-31 18:46:22
太难了!东莞家长哭诉民办高中每学期2.5万元以上,3年花费超20万

太难了!东莞家长哭诉民办高中每学期2.5万元以上,3年花费超20万

火山詩话
2026-05-31 08:37:55
张海迪是个谜!她1955年出生,虽然曾患有多种疾病,但面色红润

张海迪是个谜!她1955年出生,虽然曾患有多种疾病,但面色红润

岁月有情1314
2026-05-23 01:19:55
年会上我当众递辞职信,董事长见年终奖只有88元,全场看向经理

年会上我当众递辞职信,董事长见年终奖只有88元,全场看向经理

千秋文化
2026-05-29 19:54:56
科纳特告别利物浦:无论我走到哪里,我都会把利物浦带在身边

科纳特告别利物浦:无论我走到哪里,我都会把利物浦带在身边

懂球帝
2026-06-01 00:30:29
因伤缺阵的内马尔在巴西友谊赛前亮相,获得现场球迷热烈欢迎

因伤缺阵的内马尔在巴西友谊赛前亮相,获得现场球迷热烈欢迎

懂球帝
2026-06-01 05:35:12
2026-06-01 08:16:49
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1259文章数 69关注度
往期回顾 全部

科技要闻

戴尔诺基亚又回来了!AI重估老牌科技公司

头条要闻

媒体:中国防长不去"香会" 主办方的意图落空了

头条要闻

媒体:中国防长不去"香会" 主办方的意图落空了

体育要闻

阿森纳用最悲壮的方式,成就了巴黎王朝

娱乐要闻

朱军退休,正义虽迟但到,女方受惩

财经要闻

网红驱蚊产品,标注化妆品竟含农药成分

汽车要闻

900V+3.2秒破百 领克10+&领克10上市16.99万元起

态度原创

房产
教育
时尚
健康
手机

房产要闻

红动五月!全国抢入核心资产,广州盯紧凯旋新世界!

教育要闻

新能源专业到底好不好就业

梓渝:慢下来,也很好

尝试干细胞疗法如何避免踩坑?

手机要闻

荣耀600系列、OPPO Reno16系列首销成绩出炉

无障碍浏览 进入关怀版