Skip to content
/ leetcode Public
  • Sponsor doocs/leetcode

  • Notifications You must be signed in to change notification settings
  • Fork 8.9k

Commit d423cc1

Browse files
authoredJan 16, 2025··
feat: add solutions to lc problem: No.3422 (#3957)
No.3422.Minimum Operations to Make Subarray Elements Equal
1 parent 94b04b7 commit d423cc1

File tree

3 files changed

+139
-3
lines changed

3 files changed

+139
-3
lines changed
 

‎solution/3400-3499/3422.Minimum Operations to Make Subarray Elements Equal/README.md

+47-2
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3400-3499/3422.Mi
7272

7373
### 方法一:有序集合
7474

75-
根据题目描述,我们需要找到一个长度为 $k$ 的子数组,通过最少的操作使得子数组中的所有元素相等,即我们需要找到一个长度为 $k$ 的子数组,使得子数组中所有元素变成这 $k$ 个元素的中位数所需的最少操作次数最小
75+
根据题目描述,我们需要找到一个长度为 $k$ 的子数组,通过最少的操作使得子数组中的所有元素相等,即我们需要找到一个长度为 $k$ 的子数组,使得子数组中所有元素变成这 $k$ 个元素的中位数所需的操作次数最小
7676

7777
我们可以使用两个有序集合 $l$ 和 $r$ 分别维护 $k$ 个元素的左右两部分,其中 $l$ 用于存储 $k$ 个元素中较小的一部分,$r$ 用于存储 $k$ 个元素中较大的一部分,并且 $l$ 的元素个数要么等于 $r$ 的元素个数,要么比 $r$ 的元素个数少一个,这样 $r$ 的最小值就是 $k$ 个元素中的中位数。
7878

@@ -214,7 +214,52 @@ public:
214214
#### Go
215215
216216
```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+
}
218263
```
219264

220265
<!-- tabs:end -->

‎solution/3400-3499/3422.Minimum Operations to Make Subarray Elements Equal/README_EN.md

+46-1
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,52 @@ public:
214214
#### Go
215215
216216
```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+
}
218263
```
219264

220265
<!-- tabs:end -->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
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+
}

0 commit comments

Comments
 (0)
Please sign in to comment.