AlgoMooc
你已开通华为OD训练营权益,还差最后一步——完成入营激活(兑换课程 + 加飞书 + 登记服务群),即可解锁全部课程与专属服务。去激活 →
← 返回题库

P3207. 最大可购买的宝石数量

中等通过率 80% · 提交 524 · 通过 417
滑动窗口双指针不定滑窗

小慕的橱窗里陈列着一排宝石,每颗宝石都有不同的价格,价格记录为 `gems[i]`,其中 `0 ≤ i < n`,`n = gems.length`。小慕可以同时出售 0 颗或多颗宝石,但若同时出售多颗,则这些宝石的编号必须连续。 例如,客户最多能购买 `m` 颗宝石,且购买的宝石编号必须是 `gems[i], gems[i+1], ..., gems[i+m-1]`(`0 ≤ i < n`,`m ≤ n`)。假设小慕手头有总面值为 `value` 的钱,请问他最多能购买到多少颗宝石。如果无法购买任何宝石,则返回 `0`。

提示:带虚线的词点一下有通俗解释。

输入描述

<p> 第一行输入n,参数类型为 int,取值范围:[0,10^6],表示橱窗中宝石的总数量。 </p> <p> 之后n行分别表示从第0个到第n-1个宝石的价格,即gems[0]到gems[n-1]的价格,类型为int,取值范围:(0,1000]。 </p> <p> 之后一行输入v,类型为int,取值范围:[0,10^9]表示你拥有的钱。 </p>

输出描述

输出int类型的返回值,表示最大可购买的宝石数量。

示例

示例 1

输入

7
8
4
6
3
1
6
7
10

输出

3

说明:gems = [8,4,6,3,1,6,7], value = 10 最多购买的宝石为gems[2]至gems[4]或者gems[3]至gems[5]

示例 2

输入

0
1

输出

0

说明:gems = [],value = 1 因为没有宝石,所以返回0

示例 3

输入

9
6
1
3
1
8
9
3
2
4
15

输出

4

说明:gems = [6, 1, 3, 1, 8, 9, 3, 2, 4],value = 15 最多购买的宝石为gems[0]至gems[3]

示例 4

输入

9
1
1
1
1
1
1
1
1
1
10

输出

9

说明:gems = [1, 1, 1, 1, 1, 1, 1, 1, 1], value = 10 最多购买的宝石为gems[0]至gems[8],即全部购买

时间限制 1000 ms · 内存限制 128 MB

看不懂题目?点开图解
不定滑窗:最大可购买宝石数量 8 4 6 3 1 6 7 0 1 2 3 4 5 6 窗口 [2,4] 总和 = 6+3+1 = 10 滑动窗口(不定长)算法: 1. 右指针向右扩展窗口,累加价格 2. 当总和超过 value 时,左指针右移缩小窗口 3. 记录窗口最大长度 示例:gems = [8,4,6,3,1,6,7], value = 10 最大窗口长度 = 3(下标2~4 或 3~5) 输出:3
写完代码点「提交」,将对全部测试用例判题。

向老师提问

针对「最大可购买的宝石数量」把疑问、代码和报错填清楚,老师收到后能更快、更准地回复你。