2171. 拿出最少数目的魔法豆

题目

LeetCode连接

分析

这道题让我们求最少拿的数目。
根据题目分析:
拿出的豆子之和 + 剩余的豆子之和 = 初始的豆子之和

  • 初始的豆子之和肯定不会变
  • 我们现在要求的是【拿出的豆子之和】的最小值,我们反过来想就是求【剩余豆子之和】的最大值,然后用【初始的豆子之和】-【剩余的豆子之和】的最大值 就得到了拿出最少的豆子了。
  • 所以,我们的目标就集中在了,怎么可以求得【剩余的豆子之和】的最大值。

我们可以将 beans 从小到大排序后,枚举最终非空袋子中魔法豆的数目 v,将小于 v 的魔法豆全部清空,大于 v 的魔法豆减少至 v,这样所有非空袋子中的魔法豆就都相等了。

在这里插入图片描述
如上图所示,可以保留蓝色矩形区域内的魔法豆。设 beans 的长度为 n,以 n−i 为矩形底边长,v=beans[i] 为矩形高,则矩形面积为 (n-i) * v。

用 ∑beans[i] 减去矩形面积的最大值,即为拿出魔法豆的最小值。

代码

class Solution {
    public long minimumRemoval(int[] beans) {
        Arrays.sort(beans);
        // 初始的魔法豆之和总共的数量
        long sum = 0;
        // 记录剩余最多
        long max = 0;
        int n = beans.length;
        for(int i = 0;i < n;i ++) {
            sum += beans[i];
            max = Math.max(max,(long) (n - i) * beans[i]);
        }
        return sum - max;
    }
}
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值