通过率 51% · 提交 1,317 · 通过 668
小慕在双十一期间看中了许多打折商品,但由于预算有限,他决定从心仪的商品中挑选 3 件购买,并希望尽可能花光手中的资金。请你帮小慕设计一个程序,计算出他能花费的最大资金额。
这类题属于华为 OD 机考真题方向中「100分 / 双指针」方向的高频题型,通常考察对「100分 / 双指针」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
第一行为整型数组 M,数组长度小于100,数组元素记录单个商品的价格; 单个商品价格小于1000; 第二行输入为购买资金的额度R,R < 100000。
<span data-lark-record-data="{"rootId":"AE2tdlW1moStOKxPMtock2ADnhc","text":{"initialAttributedTexts":{"text":{"0":"第一行为整型数组 M,数组长度小于100,数组元素记录单个商品的价格;\n单个商品价格小于1000;\n第二行输入为购买资金的额度R,R < 100000。
输出为满足上述条件的最大花费额度 如果不存在满足上述条件的商品请返回-1
示例 1
输入示例
23,26,36,27 78
输出示例
76
示例 2
输入示例
23,30,40 26
输出示例
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
相关图解步骤
先看指定步骤补关键知识点,再回到本题完成标准输入输出。
注意,本题和 最接近的三数之和 几乎完全一致。唯一的区别在于,本题仅需要考虑 小于 R 的情况,不需要考虑大于 R 的情况。显然本题是 更简单 的。
假设所选的三个商品价格分别为 first、second 和 third,我们可以人为地假设这三者存在大小关系:first ≤ second ≤ third。
为了令所选的三个数之和尽可能地接近 R,我们可以先对价格数组进行 升序排序,然后从小到大考虑每一个元素作为 first,而 second 和 third 的选择则考虑使用 相向双指针 来完成。
second 和 third 的选择的相向双指针算法,类似于 经典题型的 167. 两数之和 II。
对于选择了第 i 个元素为 first 的情况,我们初始化 left = i + 1 和 right = n - 1 为两个相向双指针,并且规定 second = lst[left] 和 third = lst[right],根据 first + second + third 和最大额度 R 之间的大小关系,来修改 left 和 right。若:
first + second + third 是一个符合题目要求的选择,将三者和与 ans 进行比较并更新 ans,同时令 left 右移,才有可能找到更大的三者和。first + second + third 不是一个符合题目要求的选择,此时无需更新 ans,同时令 right 左移,三者和才能变小。当然,本题的数据量很小,n 的最大值只有 100。即使不使用双指针算法,而是直接使用 三重循环枚举 的暴力解法,时间复杂度 O(n³) = O(10⁶) 也是可以通过全部用例的。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
-1
时间限制 1000 ms · 内存限制 128 MB
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有