File tree Expand file tree Collapse file tree 3 files changed +139
-3
lines changed
solution/3400-3499/3422.Minimum Operations to Make Subarray Elements Equal Expand file tree Collapse file tree 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
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 -->
Original file line number Diff line number Diff 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 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