File tree 3 files changed +139
-3
lines changed
solution/3400-3499/3422.Minimum Operations to Make Subarray Elements Equal
3 files changed +139
-3
lines changed Original file line number Diff line number Diff line change @@ -72,7 +72,7 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3400-3499/3422.Mi
72
72
73
73
### 方法一:有序集合
74
74
75
- 根据题目描述,我们需要找到一个长度为 $k$ 的子数组,通过最少的操作使得子数组中的所有元素相等,即我们需要找到一个长度为 $k$ 的子数组,使得子数组中所有元素变成这 $k$ 个元素的中位数所需的最少操作次数最小 。
75
+ 根据题目描述,我们需要找到一个长度为 $k$ 的子数组,通过最少的操作使得子数组中的所有元素相等,即我们需要找到一个长度为 $k$ 的子数组,使得子数组中所有元素变成这 $k$ 个元素的中位数所需的操作次数最小 。
76
76
77
77
我们可以使用两个有序集合 $l$ 和 $r$ 分别维护 $k$ 个元素的左右两部分,其中 $l$ 用于存储 $k$ 个元素中较小的一部分,$r$ 用于存储 $k$ 个元素中较大的一部分,并且 $l$ 的元素个数要么等于 $r$ 的元素个数,要么比 $r$ 的元素个数少一个,这样 $r$ 的最小值就是 $k$ 个元素中的中位数。
78
78
@@ -214,7 +214,52 @@ public:
214
214
#### Go
215
215
216
216
```go
217
-
217
+ func minOperations(nums []int, k int) int64 {
218
+ l := redblacktree.New[int, int]()
219
+ r := redblacktree.New[int, int]()
220
+ merge := func(st *redblacktree.Tree[int, int], x, v int) {
221
+ c, _ := st.Get(x)
222
+ if c+v == 0 {
223
+ st.Remove(x)
224
+ } else {
225
+ st.Put(x, c+v)
226
+ }
227
+ }
228
+ var s1, s2, sz1, sz2 int
229
+ ans := math.MaxInt64
230
+ for i, x := range nums {
231
+ merge(l, x, 1)
232
+ s1 += x
233
+ y := l.Right().Key
234
+ merge(l, y, -1)
235
+ s1 -= y
236
+ merge(r, y, 1)
237
+ s2 += y
238
+ sz2++
239
+ if sz2-sz1 > 1 {
240
+ y = r.Left().Key
241
+ merge(r, y, -1)
242
+ s2 -= y
243
+ sz2--
244
+ merge(l, y, 1)
245
+ s1 += y
246
+ sz1++
247
+ }
248
+ if j := i - k + 1; j >= 0 {
249
+ ans = min(ans, s2-r.Left().Key*sz2+r.Left().Key*sz1-s1)
250
+ if _, ok := r.Get(nums[j]); ok {
251
+ merge(r, nums[j], -1)
252
+ s2 -= nums[j]
253
+ sz2--
254
+ } else {
255
+ merge(l, nums[j], -1)
256
+ s1 -= nums[j]
257
+ sz1--
258
+ }
259
+ }
260
+ }
261
+ return int64(ans)
262
+ }
218
263
```
219
264
220
265
<!-- tabs: end -->
Original file line number Diff line number Diff line change @@ -214,7 +214,52 @@ public:
214
214
#### Go
215
215
216
216
```go
217
-
217
+ func minOperations(nums []int, k int) int64 {
218
+ l := redblacktree.New[int, int]()
219
+ r := redblacktree.New[int, int]()
220
+ merge := func(st *redblacktree.Tree[int, int], x, v int) {
221
+ c, _ := st.Get(x)
222
+ if c+v == 0 {
223
+ st.Remove(x)
224
+ } else {
225
+ st.Put(x, c+v)
226
+ }
227
+ }
228
+ var s1, s2, sz1, sz2 int
229
+ ans := math.MaxInt64
230
+ for i, x := range nums {
231
+ merge(l, x, 1)
232
+ s1 += x
233
+ y := l.Right().Key
234
+ merge(l, y, -1)
235
+ s1 -= y
236
+ merge(r, y, 1)
237
+ s2 += y
238
+ sz2++
239
+ if sz2-sz1 > 1 {
240
+ y = r.Left().Key
241
+ merge(r, y, -1)
242
+ s2 -= y
243
+ sz2--
244
+ merge(l, y, 1)
245
+ s1 += y
246
+ sz1++
247
+ }
248
+ if j := i - k + 1; j >= 0 {
249
+ ans = min(ans, s2-r.Left().Key*sz2+r.Left().Key*sz1-s1)
250
+ if _, ok := r.Get(nums[j]); ok {
251
+ merge(r, nums[j], -1)
252
+ s2 -= nums[j]
253
+ sz2--
254
+ } else {
255
+ merge(l, nums[j], -1)
256
+ s1 -= nums[j]
257
+ sz1--
258
+ }
259
+ }
260
+ }
261
+ return int64(ans)
262
+ }
218
263
```
219
264
220
265
<!-- tabs: end -->
Original file line number Diff line number Diff line change
1
+ func minOperations (nums []int , k int ) int64 {
2
+ l := redblacktree .New [int , int ]()
3
+ r := redblacktree .New [int , int ]()
4
+ merge := func (st * redblacktree.Tree [int , int ], x , v int ) {
5
+ c , _ := st .Get (x )
6
+ if c + v == 0 {
7
+ st .Remove (x )
8
+ } else {
9
+ st .Put (x , c + v )
10
+ }
11
+ }
12
+ var s1 , s2 , sz1 , sz2 int
13
+ ans := math .MaxInt64
14
+ for i , x := range nums {
15
+ merge (l , x , 1 )
16
+ s1 += x
17
+ y := l .Right ().Key
18
+ merge (l , y , - 1 )
19
+ s1 -= y
20
+ merge (r , y , 1 )
21
+ s2 += y
22
+ sz2 ++
23
+ if sz2 - sz1 > 1 {
24
+ y = r .Left ().Key
25
+ merge (r , y , - 1 )
26
+ s2 -= y
27
+ sz2 --
28
+ merge (l , y , 1 )
29
+ s1 += y
30
+ sz1 ++
31
+ }
32
+ if j := i - k + 1 ; j >= 0 {
33
+ ans = min (ans , s2 - r .Left ().Key * sz2 + r .Left ().Key * sz1 - s1 )
34
+ if _ , ok := r .Get (nums [j ]); ok {
35
+ merge (r , nums [j ], - 1 )
36
+ s2 -= nums [j ]
37
+ sz2 --
38
+ } else {
39
+ merge (l , nums [j ], - 1 )
40
+ s1 -= nums [j ]
41
+ sz1 --
42
+ }
43
+ }
44
+ }
45
+ return int64 (ans )
46
+ }
You can’t perform that action at this time.
0 commit comments