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

文章目录

题目

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

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

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

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

输入:beans = [4,1,6,5]

输出:4

解释:

  • 我们从有 1 个魔法豆的袋子中拿出 1 颗魔法豆。
    剩下袋子中魔法豆的数目为:[4,0,6,5]
  • 然后我们从有 6 个魔法豆的袋子中拿出 2 个魔法豆。
    剩下袋子中魔法豆的数目为:[4,0,4,5]
  • 然后我们从有 5 个魔法豆的袋子中拿出 1 个魔法豆。
    剩下袋子中魔法豆的数目为:[4,0,4,4]

总共拿出了 1 + 2 + 1 = 4 个魔法豆,剩下非空袋子中魔法豆的数目相等。

没有比取出 4 个魔法豆更少的方案。
示例 2:

输入:beans = [2,10,3,2]

输出:7

解释:

  • 我们从有 2 个魔法豆的其中一个袋子中拿出 2 个魔法豆。
    剩下袋子中魔法豆的数目为:[0,10,3,2]
  • 然后我们从另一个有 2 个魔法豆的袋子中拿出 2 个魔法豆。
    剩下袋子中魔法豆的数目为:[0,10,3,0]
  • 然后我们从有 3 个魔法豆的袋子中拿出 3 个魔法豆。
    剩下袋子中魔法豆的数目为:[0,10,0,0]

总共拿出了 2 + 2 + 3 = 7 个魔法豆,剩下非空袋子中魔法豆的数目相等。

没有比取出 7 个魔法豆更少的方案。
提示:

1 <= beans.length <= 105

1 <= beans[i] <= 105

思路

这道题从正面角度来进行思考会有一点难度,但是我们可以换一个角度进行思考,题目中的寻找"你需要拿出魔法豆的 最少数目"转化为:

寻找一个数字 x x x,如果当前的袋子中的魔法豆的数量小于这个数 x x x,则这一袋直接清空,如果当前的袋子中的魔法豆数量数字 x x x,那么就将这一袋的数量减少至数字 x x x。

那么接下来我们的任务就是转化为如何去求解出来这个数字 x x x, 这里可以进行合理的猜测:

x x x 一定等于某一个袋子的豆子数

Q:为什么可以进行这样的猜测呢?

A:如果我们选择将 x 袋豆子变成空的,我们应该选择豆子数量最少的 x 袋。

根据这一点我们可以迭代我们应该不移除多少个袋子,并选择将要不移除的豆子总量降至最低的袋子,当然这一题如果是直接枚举不移除袋子的数量的话还是比较难处理的,因为我们还要找不移除袋子中魔法豆数量最少数量,这里就可以使用排序的技巧,先对整个数组进行排序,然后遍历的过程中就可以同时得到不移除袋子的数量以及不移除袋子中数量最小的数量

最后一定要注意数据范围

代码

c++ 复制代码
class Solution {
public:
    long long minimumRemoval(vector<int>& beans) {
        int n = beans.size();
        sort(beans.begin(), beans.end());
        long long s = 0;
        for(int i = 0; i < n; i ++) s += beans[i];
        long long left = 0;
        for(int i = 0; i < n; i ++)
        {
            left = max(left, (long long) beans[i] * (n - i));
        }
        return s - left;
    }
};
相关推荐
wan5555cn1 分钟前
多张图片生成视频模型技术深度解析
人工智能·笔记·深度学习·算法·音视频
u60629 分钟前
常用排序算法核心知识点梳理
算法·排序
鹅毛在路上了2 小时前
C++, ffmpeg, libavcodec-RTSP拉流,opencv实时预览
c++·opencv·ffmpeg
John_ToDebug2 小时前
定制 ResourceBundle 的实现与 DuiLib 思想在 Chromium 架构下的应用解析
c++·chrome·ui
蒋星熠3 小时前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程
小欣加油3 小时前
leetcode 面试题01.02判定是否互为字符重排
数据结构·c++·算法·leetcode·职场和发展
3Cloudream3 小时前
LeetCode 003. 无重复字符的最长子串 - 滑动窗口与哈希表详解
算法·leetcode·字符串·双指针·滑动窗口·哈希表·中等
王璐WL3 小时前
【c++】c++第一课:命名空间
数据结构·c++·算法
aramae3 小时前
C++ -- 模板
开发语言·c++·笔记·其他
空白到白4 小时前
机器学习-聚类
人工智能·算法·机器学习·聚类