|
| 1 | +--- |
| 2 | +title: 2171.拿出最少数目的魔法豆 |
| 3 | +date: 2024-01-18 19:29:06 |
| 4 | +tags: [题解, LeetCode, 中等, 数组, 前缀和, 排序] |
| 5 | +--- |
| 6 | + |
| 7 | +# 【LetMeFly】2171.拿出最少数目的魔法豆:排序 + 枚举 |
| 8 | + |
| 9 | +力扣题目链接:[https://leetcode.cn/problems/removing-minimum-number-of-magic-beans/](https://leetcode.cn/problems/removing-minimum-number-of-magic-beans/) |
| 10 | + |
| 11 | +<p>给你一个 <strong>正</strong> 整数数组 <code>beans</code> ,其中每个整数表示一个袋子里装的魔法豆的数目。</p> |
| 12 | + |
| 13 | +<p>请你从每个袋子中 <strong>拿出</strong> 一些豆子(也可以<strong> 不拿出</strong>),使得剩下的 <strong>非空</strong> 袋子中(即 <strong>至少</strong> 还有 <strong>一颗</strong> 魔法豆的袋子)魔法豆的数目 <strong>相等</strong> 。一旦魔法豆从袋子中取出,你不能将它放到任何其他的袋子中。</p> |
| 14 | + |
| 15 | +<p>请你返回你需要拿出魔法豆的 <strong>最少数目</strong>。</p> |
| 16 | + |
| 17 | +<p> </p> |
| 18 | + |
| 19 | +<p><strong>示例 1:</strong></p> |
| 20 | + |
| 21 | +<pre><b>输入:</b>beans = [4,<em><strong>1</strong></em>,6,5] |
| 22 | +<b>输出:</b>4 |
| 23 | +<b>解释:</b> |
| 24 | +- 我们从有 1 个魔法豆的袋子中拿出 1 颗魔法豆。 |
| 25 | + 剩下袋子中魔法豆的数目为:[4,<em><b>0</b></em>,6,5] |
| 26 | +- 然后我们从有 6 个魔法豆的袋子中拿出 2 个魔法豆。 |
| 27 | + 剩下袋子中魔法豆的数目为:[4,0,<em><strong>4</strong></em>,5] |
| 28 | +- 然后我们从有 5 个魔法豆的袋子中拿出 1 个魔法豆。 |
| 29 | + 剩下袋子中魔法豆的数目为:[4,0,4,<em><b>4</b></em>] |
| 30 | +总共拿出了 1 + 2 + 1 = 4 个魔法豆,剩下非空袋子中魔法豆的数目相等。 |
| 31 | +没有比取出 4 个魔法豆更少的方案。 |
| 32 | +</pre> |
| 33 | + |
| 34 | +<p><strong>示例 2:</strong></p> |
| 35 | + |
| 36 | +<pre><b>输入:</b>beans = [<em><strong>2</strong></em>,10,<em><strong>3</strong></em>,<em><strong>2</strong></em>] |
| 37 | +<b>输出:</b>7 |
| 38 | +<strong>解释:</strong> |
| 39 | +- 我们从有 2 个魔法豆的其中一个袋子中拿出 2 个魔法豆。 |
| 40 | + 剩下袋子中魔法豆的数目为:[<em><strong>0</strong></em>,10,3,2] |
| 41 | +- 然后我们从另一个有 2 个魔法豆的袋子中拿出 2 个魔法豆。 |
| 42 | + 剩下袋子中魔法豆的数目为:[0,10,3,<em><strong>0</strong></em>] |
| 43 | +- 然后我们从有 3 个魔法豆的袋子中拿出 3 个魔法豆。 |
| 44 | + 剩下袋子中魔法豆的数目为:[0,10,<em><strong>0</strong></em>,0] |
| 45 | +总共拿出了 2 + 2 + 3 = 7 个魔法豆,剩下非空袋子中魔法豆的数目相等。 |
| 46 | +没有比取出 7 个魔法豆更少的方案。 |
| 47 | +</pre> |
| 48 | + |
| 49 | +<p> </p> |
| 50 | + |
| 51 | +<p><strong>提示:</strong></p> |
| 52 | + |
| 53 | +<ul> |
| 54 | + <li><code>1 <= beans.length <= 10<sup>5</sup></code></li> |
| 55 | + <li><code>1 <= beans[i] <= 10<sup>5</sup></code></li> |
| 56 | +</ul> |
| 57 | + |
| 58 | + |
| 59 | + |
| 60 | +## 方法一:排序 + 枚举 |
| 61 | + |
| 62 | +二话不说先将豆子数量从小到大排个序。 |
| 63 | + |
| 64 | +统计一下一共有多少个豆子(即为all)。 |
| 65 | + |
| 66 | +遍历每个袋子中豆子的数量(假设当前豆子数量为bean),计算将小于bean的袋子移空、大于等于bean的袋子移为bean所需移除的豆子总数。 |
| 67 | + |
| 68 | +返回所有总数中的最小值即为答案。 |
| 69 | + |
| 70 | ++ 时间复杂度$O(len(beans))$ |
| 71 | ++ 空间复杂度$O(len(beans))$ |
| 72 | + |
| 73 | +### AC代码 |
| 74 | + |
| 75 | +#### C++ |
| 76 | + |
| 77 | +```cpp |
| 78 | +class Solution { |
| 79 | +public: |
| 80 | + long long minimumRemoval(vector<int>& beans) { |
| 81 | + sort(beans.begin(), beans.end()); |
| 82 | + long long all = accumulate(beans.begin(), beans.end(), 0LL); |
| 83 | + long long ans = all; |
| 84 | + for (int i = 0; i < beans.size(); i++) { |
| 85 | + ans = min(ans, all - ((long long)beans.size() - i) * beans[i]); |
| 86 | + } |
| 87 | + return ans; |
| 88 | + } |
| 89 | +}; |
| 90 | +``` |
| 91 | +
|
| 92 | +#### Python |
| 93 | +
|
| 94 | +```python |
| 95 | +# from typing import List |
| 96 | +
|
| 97 | +class Solution: |
| 98 | + def minimumRemoval(self, beans: List[int]) -> int: |
| 99 | + beans.sort() |
| 100 | + all_ = sum(beans) |
| 101 | + ans = all_ |
| 102 | + for i, thisBean in enumerate(beans): |
| 103 | + ans = min(ans, all_ - thisBean * (len(beans) - i)) |
| 104 | + return ans |
| 105 | +``` |
| 106 | + |
| 107 | +> 同步发文于CSDN,原创不易,转载经作者同意后请附上[原文链接](https://blog.tisfy.eu.org/2024/01/18/LeetCode%202171.%E6%8B%BF%E5%87%BA%E6%9C%80%E5%B0%91%E6%95%B0%E7%9B%AE%E7%9A%84%E9%AD%94%E6%B3%95%E8%B1%86/)哦~ |
| 108 | +> Tisfy:[https://letmefly.blog.csdn.net/article/details/135682601](https://letmefly.blog.csdn.net/article/details/135682601) |
0 commit comments