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

Kimi LeetCode 2835. 使子序列的和等于目标的最少操作次数 Go实现

这是 LeetCode 2835 的 Go 实现,核心思路同样是 贪心 + 位运算。

核心思路

1. 操作本质:将一个 `2^k` 拆成两个 `2^(k-1)`,代价为 1 次操作。这相当于把一个二进制高位"借位"到低位。
2. 可行性判断:操作不改变总和,如果 `sum(nums) < target`,直接返回 `-1`。
3. 贪心策略:从低位到高位处理 `target` 的每一位。如果当前位缺少 `1`,就找最近的高位进行拆分(拆分代价 = 位差)。

Go 实现

```go
func minOperations(nums []int, target int) int {
totalSum := 0
bitCount := make([]int, 32) // bitCount[i] 表示 2^i 出现的次数

// 统计每个数字的位信息
for _, num := range nums {
totalSum += num
for bitPos := 0; bitPos < 32; bitPos++ {
if (num>>bitPos)&1 == 1 {
bitCount[bitPos]++
}
}
}

// 总和不够,无法达成
if totalSum < target {
return -1
}

targetBit := 0 // 当前需要满足的 target 的位
processBit := 0 // 当前处理的位
operations := 0

for {
// 找到 target 下一个为 1 的位
for targetBit < 32 && (target>>targetBit)&1 == 0 {
targetBit++
}
if targetBit == 32 {
return operations // 所有需要的位都已满足
}

// 将低位向上合并(两个 2^i 可以合并为一个 2^(i+1),无代价)
for processBit < targetBit {
bitCount[processBit+1] += bitCount[processBit] / 2
bitCount[processBit] %= 2
processBit++
}

// 如果当前位没有可用的 1,需要向高位拆分
for bitCount[processBit] == 0 {
bitCount[processBit] = 1 // 标记该位会被拆分出来
processBit++
}

// 拆分代价 = 高位到低位的距离
operations += processBit - targetBit

// 使用当前位的一个 1
bitCount[processBit]--

// 重置 processBit,继续处理下一个 target 位
processBit = targetBit
targetBit++
}
}
```

复杂度分析

指标 复杂度
时间 O(n × log(max(nums))),约 O(32n),即 O(n)
空间 O(1),固定大小 32 的数组

示例说明

以 `nums = [1,32,1,2], target = 12` 为例:

- `target = 12 = 1100₂`,需要 bit 2(值为 4)和 bit 3(值为 8)
- 初始:`bitCount[0]=2`(两个 1),`bitCount[1]=1`(一个 2),`bitCount[5]=1`(一个 32)
- 处理 bit 2:低位合并后不够,需要从 bit 5 拆到 bit 2,代价 3。但 bit 5→bit 4→bit 3 时,bit 3 多出一个 8,所以实际只需拆分 32→16→8(2 次操作),然后 8→4(1 次),共 3 次?不对,优化后:
- 32 拆成两个 16(1 次)→ 16 拆成两个 8(1 次)→ 用一个 8,另一个 8 拆成两个 4(1 次)
- 但答案是 2 次,因为 32→16,16(1次),然后一个16→8,8(2次),此时数组有 `[1,1,2,16,8,8]`,取 `1+1+2+8=12`。确实是 2 次。

算法会自动找到最小代价,因为优先合并低位,再向最近的高位借位。

http://www.rkmt.cn/news/1428105.html

相关文章:

  • 沙漠星星酒店定制游宁夏旅行社排行及实力解析 - 互联网科技品牌测评
  • 外汇跟单避坑指南:MT4 API跟单系统中‘精确匹配’和‘禁用品种’的设置技巧与实战案例
  • 告别BIOS混乱:手把手拆解ACPI规范,看它如何统一PC的电源与配置管理
  • 武汉市汉阳区小王新旧货调剂商行:东西湖靠谱的制冷设备回收公司选哪家 - LYL仔仔
  • ArcGIS自动矢量化翻车现场:避开这3个坑,你的shp文件才能用
  • 自制电磁场麦克风:从电路原理到电子音乐采样的完整指南
  • 2026山东一卡通回收5个通用方法!盘活闲置余额,新手通用攻略 - 可可收公众号
  • 2026年江苏高强度紧固件定制实力较量攻略:非标螺栓/锁紧螺母/美制配件源头工厂选型避坑详解 - 企业名录优选推荐
  • 从零打造红外遥控Arduino小车:硬件组装、编程与调试全攻略
  • 三分钟快速上手B站视频下载:轻松保存4K大会员专属内容
  • 电脑卡顿终结者:Mem Reduct实时内存清理让旧电脑重获新生
  • 2026杭州黄金回收价格计算方式解析|看懂计价公式,不再被商家糊弄 - 奢侈品回收测评
  • 2026 哈尔滨翡翠回收避坑指南,安全高价变现不踩坑 - 薛定谔的梨花猫
  • 中天荣耀系列防静电地板的场景化设计与性能突破 - 江苏中天庄美荃
  • 2026年山东高强度紧固件定制厂家攻略:非标螺栓、美制紧固件与工程机械专用螺栓选型全详解 - 企业名录优选推荐
  • 三步实现象棋AI自动连线:YOLOv5视觉识别如何帮你轻松提升棋艺?
  • 3步掌握Apache Airflow:构建智能工作流的完整方案
  • Willow 升级 AI 语音写作助手 Scribe:根据上下文模仿用户风格输出;光帆 AI 穿戴设备接入腾讯出行,通过语音发起叫车需求丨日报
  • 2026年温州纸塑包装袋厂家综合盘点:温州领科实业、阀口袋定制、纸塑复合袋、三纸一膜包装袋、建材粉体包装袋,以扎实工艺守护各类粉体包装安全稳定 - 海棠依旧大
  • 2026金华全屋定制怎么选?大公管主攻高端集成,爱炫家居深耕自有工厂 - 企业品牌优选推荐官
  • 终极解决方案:115proxy-for-kodi插件让你在电视上免费观看115云盘视频
  • 避坑指南:用WebViewForWindow在Unity放WebRTC视频,绿屏和性能问题怎么解决?
  • Zotero Style:让你的文献管理体验焕然一新
  • 逆向工程实战:如何用OllyDbg动态分析程序中的浮点运算(以CrackMe为例)
  • 树莓派Pico 2 W与OV2640摄像头实现离线图像采集与存储方案
  • Motrix WebExtension:终极浏览器下载加速方案,告别龟速下载时代
  • 飞书文档批量导出终极指南:告别繁琐手动下载,25分钟搞定700+文档
  • 2025-2026年国内国标花篮厂家推荐:口碑好的产品应对桥梁施工重载吊装防变形场景
  • 如何快速使用Markdown实时预览工具:面向初学者的完整指南
  • 基于Arduino的自动播种机器人:从硬件搭建到代码调试全解析