Skip to content

Commit f639fce

Browse files
authored
feat: add solutions to lc problem: No.2171 (#2234)
No.2171.Removing Minimum Number of Magic Beans
1 parent 1b34a08 commit f639fce

File tree

7 files changed

+58
-56
lines changed

7 files changed

+58
-56
lines changed

solution/2100-2199/2171.Removing Minimum Number of Magic Beans/README.md

+21-19
Original file line numberDiff line numberDiff line change
@@ -57,28 +57,29 @@
5757

5858
## 解法
5959

60-
### 方法一:排序求和
60+
### 方法一:排序 + 枚举
61+
62+
我们可以将所有袋子中的魔法豆按照从小到大的顺序排列,然后枚举每个袋子的魔法豆数目 $beans[i]$ 作为最终袋子中魔法豆数目,那么一共剩余的魔法豆数目为 $beans[i] \times (n - i)$,因此需要拿出的魔法豆数目为 $s - beans[i] \times (n - i)$,其中 $s$ 为所有袋子中魔法豆的总数。我们求出所有方案中需要拿出的魔法豆数目的最小值即可。
63+
64+
时间复杂度 $O(n \times \log n)$,空间复杂度 $O(\log n)$。其中 $n$ 为袋子的数目。
6165

6266
<!-- tabs:start -->
6367

6468
```python
6569
class Solution:
6670
def minimumRemoval(self, beans: List[int]) -> int:
6771
beans.sort()
68-
ans = s = sum(beans)
69-
n = len(beans)
70-
for i, v in enumerate(beans):
71-
ans = min(ans, s - v * (n - i))
72-
return ans
72+
s, n = sum(beans), len(beans)
73+
return min(s - x * (n - i) for i, x in enumerate(beans))
7374
```
7475

7576
```java
7677
class Solution {
7778
public long minimumRemoval(int[] beans) {
7879
Arrays.sort(beans);
7980
long s = 0;
80-
for (int v : beans) {
81-
s += v;
81+
for (int x : beans) {
82+
s += x;
8283
}
8384
long ans = s;
8485
int n = beans.length;
@@ -98,7 +99,9 @@ public:
9899
long long s = accumulate(beans.begin(), beans.end(), 0ll);
99100
long long ans = s;
100101
int n = beans.size();
101-
for (int i = 0; i < n; ++i) ans = min(ans, s - 1ll * beans[i] * (n - i));
102+
for (int i = 0; i < n; ++i) {
103+
ans = min(ans, s - 1ll * beans[i] * (n - i));
104+
}
102105
return ans;
103106
}
104107
};
@@ -108,27 +111,26 @@ public:
108111
func minimumRemoval(beans []int) int64 {
109112
sort.Ints(beans)
110113
s := 0
111-
for _, v := range beans {
112-
s += v
114+
for _, x := range beans {
115+
s += x
113116
}
114117
ans := s
115118
n := len(beans)
116-
for i, v := range beans {
117-
ans = min(ans, s-v*(n-i))
119+
for i, x := range beans {
120+
ans = min(ans, s-x*(n-i))
118121
}
119122
return int64(ans)
120123
}
121124
```
122125

123126
```ts
124127
function minimumRemoval(beans: number[]): number {
125-
const n = beans.length;
126-
let sum = beans.reduce((a, c) => a + c, 0);
127128
beans.sort((a, b) => a - b);
128-
let ans = sum;
129-
for (let i = 0; i < n; i++) {
130-
let num = beans[i];
131-
ans = Math.min(sum - num * (n - i), ans);
129+
const s = beans.reduce((a, b) => a + b, 0);
130+
const n = beans.length;
131+
let ans = s;
132+
for (let i = 0; i < n; ++i) {
133+
ans = Math.min(ans, s - beans[i] * (n - i));
132134
}
133135
return ans;
134136
}

solution/2100-2199/2171.Removing Minimum Number of Magic Beans/README_EN.md

+21-19
Original file line numberDiff line numberDiff line change
@@ -53,28 +53,29 @@ There are no other solutions that removes 7 beans or fewer.
5353

5454
## Solutions
5555

56-
### Solution 1
56+
### Solution 1: Sorting + Enumeration
57+
58+
We can sort all the beans in the bags in ascending order, and then enumerate the number of beans $beans[i]$ in each bag as the final number of beans in the bag. The total remaining number of beans is $beans[i] \times (n - i)$, so the number of beans that need to be taken out is $s - beans[i] \times (n - i)$, where $s$ is the total number of beans in all bags. We need to find the minimum number of beans that need to be taken out among all schemes.
59+
60+
The time complexity is $O(n \times \log n)$, and the space complexity is $O(\log n)$. Here, $n$ is the number of bags.
5761

5862
<!-- tabs:start -->
5963

6064
```python
6165
class Solution:
6266
def minimumRemoval(self, beans: List[int]) -> int:
6367
beans.sort()
64-
ans = s = sum(beans)
65-
n = len(beans)
66-
for i, v in enumerate(beans):
67-
ans = min(ans, s - v * (n - i))
68-
return ans
68+
s, n = sum(beans), len(beans)
69+
return min(s - x * (n - i) for i, x in enumerate(beans))
6970
```
7071

7172
```java
7273
class Solution {
7374
public long minimumRemoval(int[] beans) {
7475
Arrays.sort(beans);
7576
long s = 0;
76-
for (int v : beans) {
77-
s += v;
77+
for (int x : beans) {
78+
s += x;
7879
}
7980
long ans = s;
8081
int n = beans.length;
@@ -94,7 +95,9 @@ public:
9495
long long s = accumulate(beans.begin(), beans.end(), 0ll);
9596
long long ans = s;
9697
int n = beans.size();
97-
for (int i = 0; i < n; ++i) ans = min(ans, s - 1ll * beans[i] * (n - i));
98+
for (int i = 0; i < n; ++i) {
99+
ans = min(ans, s - 1ll * beans[i] * (n - i));
100+
}
98101
return ans;
99102
}
100103
};
@@ -104,27 +107,26 @@ public:
104107
func minimumRemoval(beans []int) int64 {
105108
sort.Ints(beans)
106109
s := 0
107-
for _, v := range beans {
108-
s += v
110+
for _, x := range beans {
111+
s += x
109112
}
110113
ans := s
111114
n := len(beans)
112-
for i, v := range beans {
113-
ans = min(ans, s-v*(n-i))
115+
for i, x := range beans {
116+
ans = min(ans, s-x*(n-i))
114117
}
115118
return int64(ans)
116119
}
117120
```
118121

119122
```ts
120123
function minimumRemoval(beans: number[]): number {
121-
const n = beans.length;
122-
let sum = beans.reduce((a, c) => a + c, 0);
123124
beans.sort((a, b) => a - b);
124-
let ans = sum;
125-
for (let i = 0; i < n; i++) {
126-
let num = beans[i];
127-
ans = Math.min(sum - num * (n - i), ans);
125+
const s = beans.reduce((a, b) => a + b, 0);
126+
const n = beans.length;
127+
let ans = s;
128+
for (let i = 0; i < n; ++i) {
129+
ans = Math.min(ans, s - beans[i] * (n - i));
128130
}
129131
return ans;
130132
}

solution/2100-2199/2171.Removing Minimum Number of Magic Beans/Solution.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ class Solution {
55
long long s = accumulate(beans.begin(), beans.end(), 0ll);
66
long long ans = s;
77
int n = beans.size();
8-
for (int i = 0; i < n; ++i) ans = min(ans, s - 1ll * beans[i] * (n - i));
8+
for (int i = 0; i < n; ++i) {
9+
ans = min(ans, s - 1ll * beans[i] * (n - i));
10+
}
911
return ans;
1012
}
1113
};
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
func minimumRemoval(beans []int) int64 {
22
sort.Ints(beans)
33
s := 0
4-
for _, v := range beans {
5-
s += v
4+
for _, x := range beans {
5+
s += x
66
}
77
ans := s
88
n := len(beans)
9-
for i, v := range beans {
10-
ans = min(ans, s-v*(n-i))
9+
for i, x := range beans {
10+
ans = min(ans, s-x*(n-i))
1111
}
1212
return int64(ans)
1313
}

solution/2100-2199/2171.Removing Minimum Number of Magic Beans/Solution.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ class Solution {
22
public long minimumRemoval(int[] beans) {
33
Arrays.sort(beans);
44
long s = 0;
5-
for (int v : beans) {
6-
s += v;
5+
for (int x : beans) {
6+
s += x;
77
}
88
long ans = s;
99
int n = beans.length;
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
class Solution:
22
def minimumRemoval(self, beans: List[int]) -> int:
33
beans.sort()
4-
ans = s = sum(beans)
5-
n = len(beans)
6-
for i, v in enumerate(beans):
7-
ans = min(ans, s - v * (n - i))
8-
return ans
4+
s, n = sum(beans), len(beans)
5+
return min(s - x * (n - i) for i, x in enumerate(beans))
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
function minimumRemoval(beans: number[]): number {
2-
const n = beans.length;
3-
let sum = beans.reduce((a, c) => a + c, 0);
42
beans.sort((a, b) => a - b);
5-
let ans = sum;
6-
for (let i = 0; i < n; i++) {
7-
let num = beans[i];
8-
ans = Math.min(sum - num * (n - i), ans);
3+
const s = beans.reduce((a, b) => a + b, 0);
4+
const n = beans.length;
5+
let ans = s;
6+
for (let i = 0; i < n; ++i) {
7+
ans = Math.min(ans, s - beans[i] * (n - i));
98
}
109
return ans;
1110
}

0 commit comments

Comments
 (0)