网易首页 > 网易号 > 正文 申请入驻

2025-05-12:计算子数组的 x-sumⅠ。用go语言,给定一个长度为 n 的整数数组 nums,以及两个整数 k 和 x

0
分享至

2025-05-12:计算子数组的 x-sumⅠ。用go语言,给定一个长度为 n 的整数数组 nums,以及两个整数 k 和 x。

定义数组的 x-sum 如下:

  1. 1. 统计数组中各个元素的出现频率。

  2. 2. 选出出现次数最多的前 x 个元素的所有出现位置。若出现次数相同,则数值较大的元素优先被选中。

  3. 3. 将选中的这些元素加起来,得到 x-sum。

如果不同的元素数量少于 x,则直接返回数组所有元素的和。

请你计算数组中所有长度为 k 的连续子数组的 x-sum,返回一个长度为 n - k + 1 的数组 answer,其中 answer[i] 表示子数组 nums[i..i + k - 1] 的 x-sum。

1 <= n == nums.length <= 50。

1 <= nums[i] <= 50。

1 <= x <= k <= nums.length。

输入:nums = [1,1,2,2,3,4,2,3], k = 6, x = 2。

输出:[6,10,12]。

解释:

对于子数组 [1, 1, 2, 2, 3, 4],只保留元素 1 和 2。因此,answer[0] = 1 + 1 + 2 + 2。

对于子数组 [1, 2, 2, 3, 4, 2],只保留元素 2 和 4。因此,answer[1] = 2 + 2 + 2 + 4。注意 4 被保

留是因为其数值大于出现其他出现次数相同的元素(3 和 1)。

对于子数组 [2, 2, 3, 4, 2, 3],只保留元素 2 和 3。因此,answer[2] = 2 + 2 + 2 + 3 + 3。

目来自leetcode3318。

解决步骤

  1. 1.滑动窗口:我们需要遍历所有长度为k的子数组。滑动窗口的起始位置从0n - k

  2. 2.频率统计:对于每个子数组,统计每个元素的出现频率。

  3. 3.选择前x个元素

  • • 将频率和元素值组合成(频率, 元素值)的二元组。

  • • 对这些二元组排序:先按频率降序,频率相同则按元素值降序。

  • • 选择前x个二元组对应的元素值。

4.计算x-sum

  • • 遍历子数组,累加被选中的元素的值。

5.优化

  • • 使用红黑树(LR)来维护频率和元素值的排序。

  • L存储前x个最高频率的元素,R存储剩余元素。

  • sumL记录L中所有元素的频率乘以元素值的和(即x-sum)。

  • • 动态维护LR的大小关系:确保L的大小为x

详细过程
  1. 1.初始化

  • LR是两个红黑树,用于存储(频率, 元素值)的二元组。

  • sumL记录L中所有元素的频率 * 元素值的和。

  • cnt是一个哈希表,记录当前窗口中每个元素的出现频率。

2.滑动窗口

  • • 遍历数组,每次移动窗口时:

    • • 移除左边界的元素(如果窗口已满)。

    • • 添加右边界的元素。

    • • 更新cnt和红黑树。

3.维护红黑树

  • • 添加或删除元素时,根据(频率, 元素值)更新LR

  • • 确保L的大小为x

    • • 如果L的大小小于x,从R中移动最大的元素到L

    • • 如果L的大小大于x,从L中移动最小的元素到R

4.计算x-sum

  • sumL即为当前窗口的x-sum

时间复杂度
  • • 滑动窗口遍历:O(n)

  • • 每次窗口移动:

    • • 更新cntO(1)

    • • 红黑树操作(插入、删除、查找):O(log m),其中m是窗口中不同元素的数量(最多50)。

    • • 维护LR的大小:最多O(log m)操作。

  • • 总时间复杂度:O(n * log m),其中m <= 50,因此可以认为是O(n)

空间复杂度
  • cntO(m)m是不同元素的数量(最多50)。

  • LRO(m)

  • • 总空间复杂度:O(m),即O(1)(因为m最多为50)。

最终答案

总时间复杂度:O(n)(因为log m是常数)。
总额外空间复杂度:O(1)(因为m是常数)。

Go完整代码如下:

package main import (     "cmp"     "fmt"     "github.com/emirpasic/gods/v2/trees/redblacktree" ) type pair struct{ c, x int } // 出现次数,元素值 func less(p, q pair)int {     return cmp.Or(p.c-q.c, p.x-q.x) } func findXSum(nums []int, k, x int) []int64 {     L := redblacktree.NewWith[pair, struct{}](less)     R := redblacktree.NewWith[pair, struct{}](less)     sumL := 0// L 的元素和     cnt := map[int]int{}     add := func(x int) {         p := pair{cnt[x], x}         if p.c == 0 {             return         }         if !L.Empty() && less(p, L.Left().Key) > 0 { // p 比 L 中最小的还大             sumL += p.c * p.x             L.Put(p, struct{}{})         } else {             R.Put(p, struct{}{})         }     }     del := func(x int) {         p := pair{cnt[x], x}         if p.c == 0 {             return         }         if _, ok := L.Get(p); ok {             sumL -= p.c * p.x             L.Remove(p)         } else {             R.Remove(p)         }     }     l2r := func() {         p := L.Left().Key         sumL -= p.c * p.x         L.Remove(p)         R.Put(p, struct{}{})     }     r2l := func() {         p := R.Right().Key         sumL += p.c * p.x         R.Remove(p)         L.Put(p, struct{}{})     }     ans := make([]int64, len(nums)-k+1)     for r, in := range nums {         // 添加 in         del(in)         cnt[in]++         add(in)         l := r + 1 - k         if l < 0 {             continue         }         // 维护大小         for !R.Empty() && L.Size() < x {             r2l()         }         for L.Size() > x {             l2r()         }         ans[l] = int64(sumL)         // 移除 out         out := nums[l]         del(out)         cnt[out]--         add(out)     }     return ans } func main() {     nums := []int{1, 1, 2, 2, 3, 4, 2, 3}     k := 6     x := 2     result := findXSum(nums, k, x)     fmt.Println(result) }

我们相信 Go 语言和算法为普通开发者提供了强有力的“面试利器”,并致力于分享全面的编程知识。在这里,您可以找到最新的 Go 语言教程、算法解析、提升面试竞争力的秘籍以及行业动态。 欢迎关注“福大大架构师每日一题”,让 Go 语言和算法助力您的职业发展

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
陈牧驰陈冰官宣结婚生子,曾被法院判无恋情,如今打脸全网

陈牧驰陈冰官宣结婚生子,曾被法院判无恋情,如今打脸全网

草莓解说体育
2026-03-29 10:28:04
4万股民懵了!002538突遭ST,明起停牌

4万股民懵了!002538突遭ST,明起停牌

大众证券报
2026-03-29 11:34:12
观战一个月,胡塞武装出手了

观战一个月,胡塞武装出手了

枢密院十号
2026-03-29 14:29:08
小孩子能口无遮拦到什么程度!网友:恨不得当场找个地缝钻进去

小孩子能口无遮拦到什么程度!网友:恨不得当场找个地缝钻进去

夜深爱杂谈
2026-03-28 19:52:52
《疾速追杀》外传上线流媒体:2.5亿美元票房惨案

《疾速追杀》外传上线流媒体:2.5亿美元票房惨案

野生运营
2026-03-29 13:26:26
5亿美元就这么没了,美军一架E3预警机被伊朗导弹摧毁

5亿美元就这么没了,美军一架E3预警机被伊朗导弹摧毁

三叔的装备空间
2026-03-29 11:21:47
争议!一男子选手长期跟跑张水华疑抢镜头 遭批:不破风+故意跑慢

争议!一男子选手长期跟跑张水华疑抢镜头 遭批:不破风+故意跑慢

风过乡
2026-03-29 09:33:10
警惕!公知正在悄悄换掉我们的价值观:三件事正在瓦解社会根基

警惕!公知正在悄悄换掉我们的价值观:三件事正在瓦解社会根基

云景侃记
2026-03-26 14:56:36
黄仁勋最新惊人观点:英语专业将血洗计算机,文科成AI时代新贵族

黄仁勋最新惊人观点:英语专业将血洗计算机,文科成AI时代新贵族

南宗历史
2026-03-28 19:31:50
演员李尚宝去世终年45岁,曾患抑郁症街头狂奔精神异常,公司回应

演员李尚宝去世终年45岁,曾患抑郁症街头狂奔精神异常,公司回应

韩小娱
2026-03-28 13:31:17
演员李现晒图直呼 “快折磨死我了”!不少人已中招,医生紧急提醒

演员李现晒图直呼 “快折磨死我了”!不少人已中招,医生紧急提醒

环球网资讯
2026-03-29 10:50:06
越南成品油价格大幅下调

越南成品油价格大幅下调

缅甸中文网
2026-03-27 13:37:49
张雪峰41岁去世,《冬去春来》田雨用尊严换钱:中年人,都在硬撑

张雪峰41岁去世,《冬去春来》田雨用尊严换钱:中年人,都在硬撑

头号电影院
2026-03-28 02:15:20
中年男人无妻是啥体验?网友:没钱苦一辈子,跟结婚不结婚没关系

中年男人无妻是啥体验?网友:没钱苦一辈子,跟结婚不结婚没关系

带你感受人间冷暖
2026-03-28 17:20:05
67岁王朔现状:只能死在这儿了,女儿不让死屋里,怕房子不好卖

67岁王朔现状:只能死在这儿了,女儿不让死屋里,怕房子不好卖

谈史论天地
2026-03-27 17:05:03
亲美派全力反扑,洪秀柱语出惊人,关键时刻,郑丽文一锤定音

亲美派全力反扑,洪秀柱语出惊人,关键时刻,郑丽文一锤定音

爱意随风起呀
2026-03-29 09:45:53
战争已到临界点!以色列下达决战书:48小时定生死,立刻启用核弹

战争已到临界点!以色列下达决战书:48小时定生死,立刻启用核弹

梦史
2026-03-28 12:31:05
委内瑞拉总统马杜罗社交媒体账号发文:我们很好,内心坚定且平静

委内瑞拉总统马杜罗社交媒体账号发文:我们很好,内心坚定且平静

新京报
2026-03-29 10:39:07
反转了! 刘晓庆妹妹录音曝光:她要是真把房子捐国家,我们签字配合

反转了! 刘晓庆妹妹录音曝光:她要是真把房子捐国家,我们签字配合

陈意小可爱
2026-03-28 15:49:01
跑完马拉松!杭州45岁老板心梗离世:妻子说“再来一万次也嫁他”

跑完马拉松!杭州45岁老板心梗离世:妻子说“再来一万次也嫁他”

社会日日鲜
2026-03-29 10:43:38
2026-03-29 16:00:49
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1164文章数 61关注度
往期回顾 全部

科技要闻

马斯克承认xAI"建错了",11位创始人均离职

头条要闻

美军地面战"数周速决"方案披露 欲复刻"42天灭伊"神话

头条要闻

美军地面战"数周速决"方案披露 欲复刻"42天灭伊"神话

体育要闻

绝杀卫冕冠军后,他单手指天把胜利献给父亲

娱乐要闻

张凌赫事件持续升级!官方点名怒批

财经要闻

Kimi、Minimax 们的算力荒

汽车要闻

岚图泰山X8配置曝光 四激光雷达/华为新一代座舱

态度原创

艺术
亲子
时尚
健康
本地

艺术要闻

2025江南如画——中国油画作品展 | 入选作品选刊(二)

亲子要闻

我们的爸爸看到安集哥哥呀...

伊姐周六热推:电视剧《家事法庭》;电视剧《白日提灯》......

干细胞抗衰4大误区,90%的人都中招

本地新闻

在潍坊待了三天,没遇到一个“潍坊人”

无障碍浏览 进入关怀版