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

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.

相关推荐
热点推荐
1997年,英国归还了香港,为何拒绝归还没什么经济价值的马岛?

1997年,英国归还了香港,为何拒绝归还没什么经济价值的马岛?

鹤羽说个事
2026-04-10 22:29:55
劝退!“去客厅化”火了5年,为什么70%家庭最后都偷偷把沙发搬了回来?

劝退!“去客厅化”火了5年,为什么70%家庭最后都偷偷把沙发搬了回来?

绘本家居
2026-04-10 11:13:39
数百名医生强调:只要做过肺部CT,患者一定多加关注这5点!

数百名医生强调:只要做过肺部CT,患者一定多加关注这5点!

医学科普汇
2026-04-09 17:01:02
醉驾骑电动自行车上高速?金山交警紧急拦截除隐患

醉驾骑电动自行车上高速?金山交警紧急拦截除隐患

新闻晨报随申Hi
2026-04-10 14:52:05
朝鲜最高领导人金正恩会见王毅

朝鲜最高领导人金正恩会见王毅

新华社
2026-04-10 18:38:12
炫丧?湖南一公路插百米白灯笼,官方介入调查,结果和想的不一样

炫丧?湖南一公路插百米白灯笼,官方介入调查,结果和想的不一样

阿纂看事
2026-04-11 19:17:54
3·15晚会曝光“万能神药”涉事企业被吊销营业执照并罚200万元

3·15晚会曝光“万能神药”涉事企业被吊销营业执照并罚200万元

界面新闻
2026-04-11 14:07:04
4-0碾压越南,日本晋级女足亚洲杯4强+获2026女足世界杯参赛门票

4-0碾压越南,日本晋级女足亚洲杯4强+获2026女足世界杯参赛门票

侧身凌空斩
2026-04-11 18:53:02
王毅访朝第一天,朝方对华许下承诺,中朝强调一份条约,美日紧张

王毅访朝第一天,朝方对华许下承诺,中朝强调一份条约,美日紧张

短发过这夏
2026-04-11 21:12:42
雷克萨斯的冒险——评全新一代ES300h

雷克萨斯的冒险——评全新一代ES300h

DearAuto
2026-04-09 20:05:03
羽球亚锦赛第5日:国羽4胜2负!王祉怡再战安洗莹,石宇奇冲首冠

羽球亚锦赛第5日:国羽4胜2负!王祉怡再战安洗莹,石宇奇冲首冠

钉钉陌上花开
2026-04-11 21:10:30
马筱梅直播坦言脾气好真相!一句话戳穿:屁股决定脑袋环境定人品

马筱梅直播坦言脾气好真相!一句话戳穿:屁股决定脑袋环境定人品

大鱼娱乐观
2026-04-10 21:39:04
巴基斯坦怒了:巴基斯坦不是卡塔尔,动我们的人,打到你服!

巴基斯坦怒了:巴基斯坦不是卡塔尔,动我们的人,打到你服!

人生录
2026-04-08 00:37:17
别盯李小冉的脸了,她的背才是真正的人间清醒

别盯李小冉的脸了,她的背才是真正的人间清醒

陈意小可爱
2026-04-11 15:35:20
伊朗警告:敢再打黎巴嫩试试?话音刚落,30枚火箭弹砸过来了

伊朗警告:敢再打黎巴嫩试试?话音刚落,30枚火箭弹砸过来了

策略述
2026-04-11 16:51:58
不止赵子琪!浪姐早露真容:华谊老板娘气不过,何泓姗硬刚遭恶剪

不止赵子琪!浪姐早露真容:华谊老板娘气不过,何泓姗硬刚遭恶剪

阿纂看事
2026-04-11 16:31:45
张大千:国家的钱怎么能用来帮私人还债,由此拒绝回归大陆

张大千:国家的钱怎么能用来帮私人还债,由此拒绝回归大陆

南极狼人
2026-04-11 19:00:11
还想吓唬中国?美驻华使馆中文通报:伊朗几近灭国,美军天下无敌

还想吓唬中国?美驻华使馆中文通报:伊朗几近灭国,美军天下无敌

超喜欢我
2026-04-11 22:32:58
演员赵达宣布结婚

演员赵达宣布结婚

新快报新闻
2026-04-11 13:32:07
陈光标到底是怎么发家的?他为什么有那么多钱可以捐?

陈光标到底是怎么发家的?他为什么有那么多钱可以捐?

担扑
2026-04-03 13:56:56
2026-04-12 00:28:49
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1176文章数 64关注度
往期回顾 全部

科技要闻

半夜被燃烧瓶砸醒,OpenAI CEO发文反思

头条要闻

霍尔木兹海峡突传大消息 特朗普最新发声

头条要闻

霍尔木兹海峡突传大消息 特朗普最新发声

体育要闻

换帅之后,他们从降级区冲到升级区

娱乐要闻

郑钧回应儿子走路:会监督他挺直腰板

财经要闻

从日本翻身看:这次谁能扛住高油价?

汽车要闻

焕新极氪007/007GT上市 限时19.39万起

态度原创

游戏
艺术
数码
本地
公开课

碾压前作!《极限竞速:地平线6》创系列新纪录

艺术要闻

耗资68亿!梅洪元院士出手!长沙奥体中心冲出地面,2028年见!

数码要闻

逆天!英特尔新技术显存暴降 18 倍,8GB 显卡秒变顶配,游戏党狂喜

本地新闻

12吨巧克力有难,全网化身超级侦探添乱

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版