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

一、题目

1、题目描述

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

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

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

2、接口描述

class Solution {
public:
    long long minimumRemoval(vector& 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& 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;
    }
};

你可能感兴趣的:(leetcode每日一题,算法,数据结构,c++,leetcode,职场和发展)