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

发布时间:2024年01月18日

一、题目

1、题目描述

给定一个?正整数?数组?beans?,其中每个整数表示一个袋子里装的魔法豆的数目。

请你从每个袋子中?拿出?一些豆子(也可以?不拿出),使得剩下的?非空?袋子中(即?至少还有一颗?魔法豆的袋子)魔法豆的数目?相等。一旦把魔法豆从袋子中取出,你不能再将它放到任何袋子中。

请返回你需要拿出魔法豆的?最少数目

2、接口描述

?
class Solution {
public:
    long long minimumRemoval(vector<int>& beans) {
        
    }
};

3、原题链接

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


二、解题报告

1、思路分析

题意就是给你一个数组,你可以使每个元素减少任意值,问你最终使得剩下的元素都相等的最小代价。

那么我们知道了最终的状态是数组里面有k个相同的数字x。

那么x一定是原数组中的某个数字

否则,如果x比原数组任意元素大,那么无法通过减少元素的值来得到目标状态

如果x比原数组任意元素小,那么总能找到arr[i] > x,使得arr[i]比x更适合最终状态

所以我们把原数组升序排序,枚举每个元素作为最终状态的代价即可,获取代价的时间复杂度O(1),只要用总和减去最终状态就是代价

排序是O(nlogn),排序递归开销要O(logn)

2、复杂度

时间复杂度: O(nlogn) 空间复杂度:O(logn)

3、代码详解

?
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;
    }
};

文章来源:https://blog.csdn.net/EQUINOX1/article/details/135672898
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。