给定一个?正整数?数组?
beans
?,其中每个整数表示一个袋子里装的魔法豆的数目。请你从每个袋子中?拿出?一些豆子(也可以?不拿出),使得剩下的?非空?袋子中(即?至少还有一颗?魔法豆的袋子)魔法豆的数目?相等。一旦把魔法豆从袋子中取出,你不能再将它放到任何袋子中。
请返回你需要拿出魔法豆的?最少数目。
?
class Solution {
public:
long long minimumRemoval(vector<int>& beans) {
}
};
题意就是给你一个数组,你可以使每个元素减少任意值,问你最终使得剩下的元素都相等的最小代价。
那么我们知道了最终的状态是数组里面有k个相同的数字x。
那么x一定是原数组中的某个数字
否则,如果x比原数组任意元素大,那么无法通过减少元素的值来得到目标状态
如果x比原数组任意元素小,那么总能找到arr[i] > x,使得arr[i]比x更适合最终状态
所以我们把原数组升序排序,枚举每个元素作为最终状态的代价即可,获取代价的时间复杂度O(1),只要用总和减去最终状态就是代价
排序是O(nlogn),排序递归开销要O(logn)
时间复杂度: O(nlogn) 空间复杂度:O(logn)
?
class Solution {
public:
long long minimumRemoval(vector<int>& beans) {
sort(beans.begin() , beans.end());
long long sum = accumulate(beans.begin() , beans.end() , 0LL),
n = beans.size() , ret = sum;
for(int i = 0 ; i < n ; i++)
ret = min(ret , sum - (n - i) * beans[i]);
return ret;
}
};