给定一个?正整数?数组?beans?,其中每个整数表示一个袋子里装的魔法豆的数目。
请你从每个袋子中?拿出?一些豆子(也可以?不拿出),使得剩下的?非空?袋子中(即?至少还有一颗?魔法豆的袋子)魔法豆的数目?相等。一旦把魔法豆从袋子中取出,你不能再将它放到任何袋子中。
请返回你需要拿出魔法豆的?最少数目。
public class Solution {
public long minimumRemoval(int[] beans) {
// 袋子数量
int length = beans.length;
// 对每个袋子里的豆子数排序
Arrays.sort(beans);
// 记录总兜子数
long total = 0;
for (int bean: beans) {
total += bean;
}
// min记录移除数量
// 默认移除全部的豆子
long min = total;
int lastRest = 0;
for (int i = 0; i < length; i++) {
if (beans[i] == lastRest) continue;
// beans[i]为剩余数量, length - i 表示有多少袋子数量大于剩余数量
// 剩余数量 * 大于剩余数量的袋子数就是最终剩余多少豆子
// current表示需要移除的豆子数
long current = total - (long) beans[i] * (length - i);
min = Math.min(min, current);
lastRest = beans[i];
}
return min;
}
}
class Solution {
public:
long long minimumRemoval(vector<int>& beans) {
// 袋子数量
int length = beans.size();
// 对每个袋子里的豆子数排序
sort(beans.begin(), beans.end());
// 记录总兜子数
long long total = 0;
for (int bean : beans) {
total += bean;
}
// min记录移除数量
// 默认移除全部的豆子
long long min = total;
int lastRest = 0;
for (int i = 0; i < length; i++) {
if (beans[i] == lastRest) continue;
// beans[i]为剩余数量, length - i 表示有多少袋子数量大于剩余数量
// 剩余数量 * 大于剩余数量的袋子数就是最终剩余多少豆子
// current表示需要移除的豆子数
long long current = total - (long long)beans[i] * (length - i);
min = min < current ? min : current;
lastRest = beans[i];
}
return min;
}
};