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

题目

LeetCode连接

分析

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

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

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

2171. 拿出最少数目的魔法豆_第1张图片
如上图所示,可以保留蓝色矩形区域内的魔法豆。设 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;
    }
}

你可能感兴趣的:(leetcode刷题,leetcode)