news 2026/5/13 0:23:35

DeepSeek LeetCode 2321.拼接数组的最大分数 Go实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek LeetCode 2321.拼接数组的最大分数 Go实现

这是 LeetCode 2321「拼接数组的最大分数」的 Go 语言实现:

```go
func maximumsSplicedArray(nums1 []int, nums2 []int) int {
n := len(nums1)
sum1, sum2 := 0, 0
diff := make([]int, n)

// 计算两个数组的总和及差值数组
for i := 0; i < n; i++ {
sum1 += nums1[i]
sum2 += nums2[i]
diff[i] = nums2[i] - nums1[i]
}

// 情况1:从nums2中选一段替换到nums1
maxGain1 := maxSubarraySum(diff) // 最大子数组和

// 情况2:从nums1中选一段替换到nums2
// 等价于求 diff 的相反数的最大子数组和
maxGain2 := maxSubarraySum(negate(diff))

// 取两种方案的最大值
return max(sum1+maxGain1, sum2+maxGain2)
}

// 最大子数组和(Kadane算法,允许空子数组,最小为0)
func maxSubarraySum(arr []int) int {
curr, best := 0, 0
for _, val := range arr {
curr += val
if curr < 0 {
curr = 0
}
if curr > best {
best = curr
}
}
return best
}

// 返回数组的相反数
func negate(arr []int) []int {
res := make([]int, len(arr))
for i, v := range arr {
res[i] = -v
}
return res
}

func max(a, b int) int {
if a > b {
return a
}
return b
}
```

核心思路:

1. 问题转化:交换一段子数组相当于计算差分数组的最大子段和
· 定义 diff[i] = nums2[i] - nums1[i]
· 将 nums2 的一段替换到 nums1,增益为 sum(diff[l..r])
· 将 nums1 的一段替换到 nums2,相当于 diff 取反后再求最大子段和
2. 算法步骤:
· 计算 sum1、sum2 和 diff 数组
· 用 Kadane 算法求 diff 的最大子段和(允许空子段,最小为0)
· 同理求 -diff 的最大子段和
· 答案 = max(sum1+增益1, sum2+增益2)
3. 复杂度:O(n) 时间,O(n) 额外空间(diff 数组可优化为 O(1) 空间)

package main

func maximumsSplicedArray(nums1 []int, nums2 []int) int {
n := len(nums1)
sum1, sum2 := 0, 0
diff := make([]int, n)
for i := 0; i < n; i++ {
sum1 += nums1[i]
sum2 += nums2[i]
diff[i] = nums2[i] - nums1[i]
}

// 计算最大子段和(允许空子段,即至少为0)
maxGain1 := maxSubarraySum(diff) // 对nums1的增益
maxGain2 := maxSubarraySum(neg(diff)) // 对nums2的增益

ans := sum1 + maxGain1
if sum2+maxGain2 > ans {
ans = sum2 + maxGain2
}
return ans
}

// 计算最大子段和(如果全为负数则返回0)
func maxSubarraySum(arr []int) int {
maxEndingHere := 0
maxSoFar := 0
for _, v := range arr {
maxEndingHere += v
if maxEndingHere < 0 {
maxEndingHere = 0
}
if maxEndingHere > maxSoFar {
maxSoFar = maxEndingHere
}
}
return maxSoFar
}

// 返回数组的相反数
func neg(arr []int) []int {
res := make([]int, len(arr))
for i, v := range arr {
res[i] = -v
}
return res
}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/13 0:18:09

图解人工智能(11)让人惊讶的AI

人工智能已经融入到我们的生活之中&#xff0c;如便捷的刷脸支付&#xff0c;帮我们扫地的机器人。想一想&#xff0c;你身边还有哪些有趣的人工智能设备&#xff1f;以一种设备为例&#xff0c;搜索它的相关信息&#xff0c;看它为我们的生活带来了哪些便利。开放讨论题&#…

作者头像 李华
网站建设 2026/5/13 0:17:56

如何免费在普通电脑上运行macOS:VMware Unlocker完整指南

如何免费在普通电脑上运行macOS&#xff1a;VMware Unlocker完整指南 【免费下载链接】unlocker VMware Workstation macOS 项目地址: https://gitcode.com/gh_mirrors/unlo/unlocker 你是否曾经因为昂贵的苹果硬件而放弃了使用macOS的念头&#xff1f;作为一名iOS开发…

作者头像 李华
网站建设 2026/5/13 0:16:56

5步完成微信聊天记录永久备份:WeChatExporter开源工具完整指南

5步完成微信聊天记录永久备份&#xff1a;WeChatExporter开源工具完整指南 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否担心珍贵的微信聊天记录会因为手机丢失、…

作者头像 李华
网站建设 2026/5/13 0:16:54

5分钟掌握Windows和Office智能激活:KMS_VL_ALL_AIO终极解决方案

5分钟掌握Windows和Office智能激活&#xff1a;KMS_VL_ALL_AIO终极解决方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统频繁弹出激活提示而烦恼吗&#xff1f;Office突然变…

作者头像 李华