[leetcode题解] 第1648题Sell Diminishing Valued Colored Balls

本篇博客详细分析了LeetCode第1648题——如何高效地卖出减价彩色球,提出两种解法。第一种解法利用贪心策略和最大堆,但效率较低;第二种解法通过寻找最大值和次最大值,结合二分查找优化,时间复杂度为O(n log M),其中n为球的种类数,M为最大价值。通过示例展示了算法的运行过程。
摘要由CSDN通过智能技术生成

https://leetcode-cn.com/problems/sell-diminishing-valued-colored-balls/

分析

很容易找到这道题的贪心策略:每次卖出价值最大(数目最多)的那种球。
我们可以使用最大堆来辅助获取最大的inventory[i],把它加到ans后再把inventory[i] - 1放回堆中,同时orders--。这种思路很简单,但效率太低了,时间复杂度为 O ( o r d e r s ⋅ l o g n ) O(orders\cdot logn) O(orderslogn) n n n为球的种类。

解法一

最直观的加速方法是什么?我们可以获取到最大值inventory[i]和次最大值inventory[j],然后将第i种球卖出inventory[i] - inventory[j]次并计算这个过程的利润。接下来会有两个最大值inventory[i] == inventory[j],需要再寻找次最大值inventory[k],然后将第i和第j种球都卖出inventory[i] - inventory[k]次,并计算利润。重复这个过程直到orders == 0,就找到了答案。
我们可以先对inventory进行排序来帮助我们找到每一次计算的最大值和次最大值。
以示例3为例展示该算法的过程:

阶段一:[10, 8, 6, 4, 2] orders = 20
\qquad \quad 最大值10,次最大值8,有1个最大值。因此1种球卖2次,利润为1 * (10 + 9) = 19。
阶段二:[8, 8, 6, 4, 2] orders = 18
\qquad \quad 最大值8,次最大值6,有2个最大值。因此2种球分别卖2次,利润为2 * (8 + 7) = 30。
阶段三:[6, 6, 6, 4, 2] orders = 14
\qquad \quad 最大值6,次最大值4,有3个最大值。因此3种球分别卖2次,利润为3 * (6 + 5) = 33。
阶段四:[4, 4, 4, 4, 2] orders = 8
\qquad \quad 最大值4, 次最大值2,有4个最大值。因此4种球分别卖2次,利润为4 * (4 + 3) = 28。
总利润为110。

orders小于当前可以卖的总次数时,需要计算数目最多的那几种球分别可以卖多少次,剩余的orders用来给这其中的某几种球再卖一次。

代码:
class Solution {
   
public:
    in
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值