Skip to content

Commit e2f785e

Browse files
committed
feat: add solutions to lc problem: No.1887
No.1887.Reduction Operations to Make the Array Elements Equal
1 parent 646f09c commit e2f785e

File tree

7 files changed

+170
-76
lines changed

7 files changed

+170
-76
lines changed

solution/1800-1899/1887.Reduction Operations to Make the Array Elements Equal/README.md

Lines changed: 76 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,13 @@
6262

6363
<!-- 这里可写通用的实现逻辑 -->
6464

65-
排序。
65+
**方法一:排序**
66+
67+
对 $nums$ 进行排序,用 $cnt$ 表示元素所需的操作次数,初始时 $cnt=0$。
68+
69+
遍历 $nums[1..n-1]$,如果当前元素 $nums[i]$ 不等于 $nums[i-1]$,则将 $cnt$ 加一。累加当前 $cnt$ 到答案 $ans$。
70+
71+
时间复杂度 $O(nlogn)$。
6672

6773
<!-- tabs:start -->
6874

@@ -74,12 +80,22 @@
7480
class Solution:
7581
def reductionOperations(self, nums: List[int]) -> int:
7682
nums.sort()
77-
cnt, res, n = 0, 0, len(nums)
78-
for i in range(1, n):
79-
if nums[i] != nums[i - 1]:
83+
ans = cnt = 0
84+
for i, v in enumerate(nums[1:]):
85+
if v != nums[i]:
8086
cnt += 1
81-
res += cnt
82-
return res
87+
ans += cnt
88+
return ans
89+
```
90+
91+
```python
92+
class Solution:
93+
def reductionOperations(self, nums: List[int]) -> int:
94+
ans = cnt = 0
95+
for _, v in sorted(Counter(nums).items()):
96+
ans += cnt * v
97+
cnt += 1
98+
return ans
8399
```
84100

85101
### **Java**
@@ -90,14 +106,31 @@ class Solution:
90106
class Solution {
91107
public int reductionOperations(int[] nums) {
92108
Arrays.sort(nums);
93-
int cnt = 0, res = 0, n = nums.length;
94-
for (int i = 1; i < n; ++i) {
109+
int ans = 0, cnt = 0;
110+
for (int i = 1; i < nums.length; ++i) {
95111
if (nums[i] != nums[i - 1]) {
96112
++cnt;
97113
}
98-
res += cnt;
114+
ans += cnt;
115+
}
116+
return ans;
117+
}
118+
}
119+
```
120+
121+
```java
122+
class Solution {
123+
public int reductionOperations(int[] nums) {
124+
Map<Integer, Integer> tm = new TreeMap<>();
125+
for (int v : nums) {
126+
tm.put(v, tm.getOrDefault(v, 0) + 1);
127+
}
128+
int ans = 0, cnt = 0;
129+
for (int v : tm.values()) {
130+
ans += cnt * v;
131+
++cnt;
99132
}
100-
return res;
133+
return ans;
101134
}
102135
}
103136
```
@@ -107,14 +140,13 @@ class Solution {
107140
```ts
108141
function reductionOperations(nums: number[]): number {
109142
nums.sort((a, b) => a - b);
110-
let n = nums.length;
111-
let ans = 0,
112-
count = 0;
113-
for (let i = 1; i < n; i++) {
143+
let ans = 0;
144+
let cnt = 0;
145+
for (let i = 1; i < nums.length; ++i) {
114146
if (nums[i] != nums[i - 1]) {
115-
count++;
147+
++cnt;
116148
}
117-
ans += count;
149+
ans += cnt;
118150
}
119151
return ans;
120152
}
@@ -127,12 +159,30 @@ class Solution {
127159
public:
128160
int reductionOperations(vector<int>& nums) {
129161
sort(nums.begin(), nums.end());
130-
int cnt = 0, res = 0, n = nums.size();
131-
for (int i = 1; i < n; ++i) {
132-
if (nums[i] != nums[i - 1]) ++cnt;
133-
res += cnt;
162+
int ans = 0, cnt = 0;
163+
for (int i = 1; i < nums.size(); ++i)
164+
{
165+
cnt += nums[i] != nums[i - 1];
166+
ans += cnt;
167+
}
168+
return ans;
169+
}
170+
};
171+
```
172+
173+
```cpp
174+
class Solution {
175+
public:
176+
int reductionOperations(vector<int>& nums) {
177+
map<int, int> m;
178+
for (int v : nums) ++m[v];
179+
int ans = 0, cnt = 0;
180+
for (auto [_, v] : m)
181+
{
182+
ans += cnt * v;
183+
++cnt;
134184
}
135-
return res;
185+
return ans;
136186
}
137187
};
138188
```
@@ -142,14 +192,14 @@ public:
142192
```go
143193
func reductionOperations(nums []int) int {
144194
sort.Ints(nums)
145-
cnt, res, n := 0, 0, len(nums)
146-
for i := 1; i < n; i++ {
147-
if nums[i] != nums[i-1] {
195+
ans, cnt := 0, 0
196+
for i, v := range nums[1:] {
197+
if v != nums[i] {
148198
cnt++
149199
}
150-
res += cnt
200+
ans += cnt
151201
}
152-
return res
202+
return ans
153203
}
154204
```
155205

solution/1800-1899/1887.Reduction Operations to Make the Array Elements Equal/README_EN.md

Lines changed: 69 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,22 @@
6464
class Solution:
6565
def reductionOperations(self, nums: List[int]) -> int:
6666
nums.sort()
67-
cnt, res, n = 0, 0, len(nums)
68-
for i in range(1, n):
69-
if nums[i] != nums[i - 1]:
67+
ans = cnt = 0
68+
for i, v in enumerate(nums[1:]):
69+
if v != nums[i]:
7070
cnt += 1
71-
res += cnt
72-
return res
71+
ans += cnt
72+
return ans
73+
```
74+
75+
```python
76+
class Solution:
77+
def reductionOperations(self, nums: List[int]) -> int:
78+
ans = cnt = 0
79+
for _, v in sorted(Counter(nums).items()):
80+
ans += cnt * v
81+
cnt += 1
82+
return ans
7383
```
7484

7585
### **Java**
@@ -78,14 +88,31 @@ class Solution:
7888
class Solution {
7989
public int reductionOperations(int[] nums) {
8090
Arrays.sort(nums);
81-
int cnt = 0, res = 0, n = nums.length;
82-
for (int i = 1; i < n; ++i) {
91+
int ans = 0, cnt = 0;
92+
for (int i = 1; i < nums.length; ++i) {
8393
if (nums[i] != nums[i - 1]) {
8494
++cnt;
8595
}
86-
res += cnt;
96+
ans += cnt;
8797
}
88-
return res;
98+
return ans;
99+
}
100+
}
101+
```
102+
103+
```java
104+
class Solution {
105+
public int reductionOperations(int[] nums) {
106+
Map<Integer, Integer> tm = new TreeMap<>();
107+
for (int v : nums) {
108+
tm.put(v, tm.getOrDefault(v, 0) + 1);
109+
}
110+
int ans = 0, cnt = 0;
111+
for (int v : tm.values()) {
112+
ans += cnt * v;
113+
++cnt;
114+
}
115+
return ans;
89116
}
90117
}
91118
```
@@ -95,14 +122,13 @@ class Solution {
95122
```ts
96123
function reductionOperations(nums: number[]): number {
97124
nums.sort((a, b) => a - b);
98-
let n = nums.length;
99-
let ans = 0,
100-
count = 0;
101-
for (let i = 1; i < n; i++) {
125+
let ans = 0;
126+
let cnt = 0;
127+
for (let i = 1; i < nums.length; ++i) {
102128
if (nums[i] != nums[i - 1]) {
103-
count++;
129+
++cnt;
104130
}
105-
ans += count;
131+
ans += cnt;
106132
}
107133
return ans;
108134
}
@@ -115,12 +141,30 @@ class Solution {
115141
public:
116142
int reductionOperations(vector<int>& nums) {
117143
sort(nums.begin(), nums.end());
118-
int cnt = 0, res = 0, n = nums.size();
119-
for (int i = 1; i < n; ++i) {
120-
if (nums[i] != nums[i - 1]) ++cnt;
121-
res += cnt;
144+
int ans = 0, cnt = 0;
145+
for (int i = 1; i < nums.size(); ++i)
146+
{
147+
cnt += nums[i] != nums[i - 1];
148+
ans += cnt;
149+
}
150+
return ans;
151+
}
152+
};
153+
```
154+
155+
```cpp
156+
class Solution {
157+
public:
158+
int reductionOperations(vector<int>& nums) {
159+
map<int, int> m;
160+
for (int v : nums) ++m[v];
161+
int ans = 0, cnt = 0;
162+
for (auto [_, v] : m)
163+
{
164+
ans += cnt * v;
165+
++cnt;
122166
}
123-
return res;
167+
return ans;
124168
}
125169
};
126170
```
@@ -130,14 +174,14 @@ public:
130174
```go
131175
func reductionOperations(nums []int) int {
132176
sort.Ints(nums)
133-
cnt, res, n := 0, 0, len(nums)
134-
for i := 1; i < n; i++ {
135-
if nums[i] != nums[i-1] {
177+
ans, cnt := 0, 0
178+
for i, v := range nums[1:] {
179+
if v != nums[i] {
136180
cnt++
137181
}
138-
res += cnt
182+
ans += cnt
139183
}
140-
return res
184+
return ans
141185
}
142186
```
143187

solution/1800-1899/1887.Reduction Operations to Make the Array Elements Equal/Solution.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ class Solution {
22
public:
33
int reductionOperations(vector<int>& nums) {
44
sort(nums.begin(), nums.end());
5-
int cnt = 0, res = 0, n = nums.size();
6-
for (int i = 1; i < n; ++i) {
7-
if (nums[i] != nums[i - 1]) ++cnt;
8-
res += cnt;
5+
int ans = 0, cnt = 0;
6+
for (int i = 1; i < nums.size(); ++i)
7+
{
8+
cnt += nums[i] != nums[i - 1];
9+
ans += cnt;
910
}
10-
return res;
11+
return ans;
1112
}
1213
};
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
func reductionOperations(nums []int) int {
22
sort.Ints(nums)
3-
cnt, res, n := 0, 0, len(nums)
4-
for i := 1; i < n; i++ {
5-
if nums[i] != nums[i-1] {
3+
ans, cnt := 0, 0
4+
for i, v := range nums[1:] {
5+
if v != nums[i] {
66
cnt++
77
}
8-
res += cnt
8+
ans += cnt
99
}
10-
return res
10+
return ans
1111
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
class Solution {
22
public int reductionOperations(int[] nums) {
33
Arrays.sort(nums);
4-
int cnt = 0, res = 0, n = nums.length;
5-
for (int i = 1; i < n; ++i) {
4+
int ans = 0, cnt = 0;
5+
for (int i = 1; i < nums.length; ++i) {
66
if (nums[i] != nums[i - 1]) {
77
++cnt;
88
}
9-
res += cnt;
9+
ans += cnt;
1010
}
11-
return res;
11+
return ans;
1212
}
1313
}
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
class Solution:
22
def reductionOperations(self, nums: List[int]) -> int:
33
nums.sort()
4-
cnt, res, n = 0, 0, len(nums)
5-
for i in range(1, n):
6-
if nums[i] != nums[i - 1]:
4+
ans = cnt = 0
5+
for i, v in enumerate(nums[1:]):
6+
if v != nums[i]:
77
cnt += 1
8-
res += cnt
9-
return res
8+
ans += cnt
9+
return ans
Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
function reductionOperations(nums: number[]): number {
22
nums.sort((a, b) => a - b);
3-
let n = nums.length;
4-
let ans = 0,
5-
count = 0;
6-
for (let i = 1; i < n; i++) {
3+
let ans = 0;
4+
let cnt = 0;
5+
for (let i = 1; i < nums.length; ++i) {
76
if (nums[i] != nums[i - 1]) {
8-
count++;
7+
++cnt;
98
}
10-
ans += count;
9+
ans += cnt;
1110
}
1211
return ans;
1312
}

0 commit comments

Comments
 (0)