49 lines
842 B
Go
49 lines
842 B
Go
package q3318
|
|
|
|
import "slices"
|
|
|
|
type NumOccur struct {
|
|
num, occur int
|
|
}
|
|
|
|
func xSum(x int, occurances map[int]int, buf []NumOccur) int {
|
|
buf = buf[:]
|
|
for n, o := range occurances {
|
|
buf = append(buf, NumOccur{n, o})
|
|
}
|
|
slices.SortFunc(buf, func(a, b NumOccur) int {
|
|
if a.occur != b.occur {
|
|
return b.occur - a.occur
|
|
}
|
|
return b.num - a.num
|
|
})
|
|
|
|
sum := 0
|
|
for i := 0; i < x && i < len(buf); i++ {
|
|
sum += buf[i].num * buf[i].occur
|
|
}
|
|
return sum
|
|
}
|
|
|
|
func findXSum(nums []int, k int, x int) []int {
|
|
ret := make([]int, len(nums)-k+1)
|
|
|
|
buf := make([]NumOccur, k)
|
|
occur := make(map[int]int, k)
|
|
for i := range nums {
|
|
occur[nums[i]]++
|
|
if i >= k {
|
|
occur[nums[i-k]]--
|
|
if occur[nums[i-k]] == 0 {
|
|
delete(occur, nums[i-k])
|
|
}
|
|
}
|
|
if i >= k-1 {
|
|
ret[i-k+1] = xSum(x, occur, buf)
|
|
}
|
|
}
|
|
|
|
return ret
|
|
}
|
|
|
|
var _ = findXSum
|