通过率 65% · 提交 1,125 · 通过 736
小慕正在开发一个寿司店周年庆的优惠活动功能。寿司转盘上总共有n盘寿司,prices[i] 是第 i 盘寿司的价格。如果客户选择了第 i 盘寿司,系统会自动赠送,前提是;如果没有满足条件的 j,则不赠送寿司。 每个价格的寿司都可无限供应。
这类题属于华为 OD 机考真题方向中「100分 / 2024E」方向的高频题型,通常考察对「100分 / 2024E」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
输入的每一个数字代表每盘寿司的价格,每盘寿司的价格之间使用空格分隔
寿司的盘数 n范围为: 1 <= n <= 500
输出享受优惠后的一组数据,每个值表示客户选择第 i 盘寿司时实际得到的寿司的总价格。使用空格进行分隔。
示例 1
输入示例
3 15 6 14
输出示例
3 21 9 17
示例 2
输入示例
5 12 7 13
输出示例
5 19 12 18
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
本题是在环型数组中计算每一个元素右侧的下一个更小元素,显然应该使用单调栈来完成。本题和 经典题型. 下一个更大元素 II 以及 【单调栈】2025A-阿里巴巴找黄金宝箱(4) 的方法非常类似。
处理环型数组,一个常见的技巧是将数组 nums 进行拼接,然后对拼接后的数组进行单调栈操作,找到每一个元素右边的第一个更小元素即可。
对于范围落在 [0, 2*n-1] 的索引 i,为了得到在原数组中的索引 idx,我们可以对 i 进行求余操作来获得。
即 idx = i % n 就可以得到对应原数组中的索引。
注意到一个问题,本题所需要计算的内容是每一个元素加上右边第一个更小元素的结果。可以有两种处理方式:
1. 初始化答案数组为原数组的一个拷贝(这样就可以避免最小值的额外更新),每次更新答案将 ans[idx] 更新为 nums[idx] 加上右边第一个更小元素。 2. 初始化一个新的长度为 n 的数组 help 仅用于储存每一个元素右边第一个更小元素,每次更新答案都仅更新 help 数组。最终遍历结束后将 help 中的每一个元素和 nums 中对应元素进行相加,即为答案数组。
后续写法采用是第一种处理方式,但或许第二种处理方式更加简单易懂,感兴趣的同学可以试一试。
PS:由于数据范围最多只有 500,所以 O(n²) 的暴力解是可以接受的。不熟悉单调栈的同学在考试遇到可以尝试使用暴力解。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有