这道题让我们求最少拿的数目。
根据题目分析:
拿出的豆子之和 + 剩余的豆子之和 = 初始的豆子之和
我们可以将 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;
}
}