题目
分析
这道题让我们求最少拿的数目。
根据题目分析:
拿出的豆子之和 + 剩余的豆子之和 = 初始的豆子之和
- 初始的豆子之和肯定不会变
- 我们现在要求的是【拿出的豆子之和】的最小值,我们反过来想就是求【剩余豆子之和】的最大值,然后用【初始的豆子之和】-【剩余的豆子之和】的最大值 就得到了拿出最少的豆子了。
- 所以,我们的目标就集中在了,怎么可以求得【剩余的豆子之和】的最大值。
我们可以将 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;
}
}