当前位置: 首页 > news >正文

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
}

http://www.jsqmd.com/news/805465/

相关文章:

  • 下行周期生存之道 = 低风险试错 × 即时反馈 × 长期复购
  • 3步搞定:在Windows电脑上直接运行Android应用
  • 使用 PM2 部署 Node.js 应用时怎么配置重启策略避免异步任务中断丢失
  • 观察taotoken用量看板如何清晰呈现各模型token消耗
  • 2026年GEO行业格局解析:最新全域技术型与垂直深耕型十大服务商实力对比 - GEO优化
  • 3步免费获取公式识别神器:img2latex-mathpix本地部署终极指南
  • Python爬虫实战:构建智能职位信息聚合工具JobClaw
  • 2026年当下,探寻重庆全屋翻新口碑标杆:快装巴士为何受青睐? - 2026年企业推荐榜
  • 贾子竞争哲学与中国 AI 道层跃迁之路
  • libhv实战:300行构建C++异步RPC框架,集成Protobuf与evpp
  • Spratt Skills:基于LLM规划与代码执行的OpenClaw家庭自动化架构实践
  • 2026年至今,四川地区可靠的成都实木门批发优选推荐 - 2026年企业推荐榜
  • Articuler.Ai 技术深度解析:海量人脉匹配、数字足迹解析与高转化冷触达引擎
  • Python 爬虫高级实战:爬虫接口限流自适应调节
  • Verilog移位运算避坑指南:为什么你的`reg1 << (a+b+3‘d4)`结果总不对?
  • 基于MCP协议与FFmpeg构建AI视频处理服务器:原理、部署与实战
  • Poppler Windows终极指南:3步搞定Windows平台PDF处理难题
  • 8720个AI岗位真相:LLM和Agent吃掉58%的岗位
  • 淘金币自动化脚本:3分钟完成淘宝全任务,每天节省20分钟
  • LayerDivider终极指南:5分钟掌握智能插画分层技术
  • 四川弱电劳务分包技术规范与合规服务商实操推荐 - 优质品牌商家
  • SRWE终极指南:5分钟学会游戏窗口分辨率自定义技巧
  • ARMv8存储释放指令原理与应用详解
  • Clawforce:开源AI智能体团队基础设施,实现持久化与安全协作
  • 贾子之路理论体系与六步实施路径详解
  • 2026届学术党必备的六大降重复率平台推荐榜单
  • Krita AI智能选区工具:3分钟掌握专业级图像分离技术
  • Notero终极指南:打通Zotero与Notion的学术工作流桥梁
  • 终极指南:如何让淘宝淘金币任务全自动完成,每天节省20分钟
  • 如何解锁数字化制造的数据瓶颈:stltostp的轻量级STL转STEP解决方案