当前位置: 首页 > 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.jsqmd.com/news/916791/

相关文章:

  • 如何快速备份和导出iOS微信聊天记录:完整解决方案
  • 数据库读写分离:从原理到实战,构建高并发系统
  • 跨越半世纪的无线电对话:真空管接收机与SDR实战对比
  • 武汉市汉阳区小王新旧货调剂商行:青山专业的制冷设备回收公司推荐几家 - LYL仔仔
  • Equalizer APO深度解析:开源音频处理引擎的技术实现与实战指南
  • 如何高效使用网盘直链下载助手:完整实用指南
  • 外汇跟单避坑指南:MT4 API跟单系统中‘精确匹配’和‘禁用品种’的设置技巧与实战案例
  • 港科大DeepTech 31 | 创新全彩Micro-LED微型显示器:AR/XR行业的革命性技术
  • 告别BIOS混乱:手把手拆解ACPI规范,看它如何统一PC的电源与配置管理
  • 武汉市汉阳区小王新旧货调剂商行:东西湖靠谱的制冷设备回收公司选哪家 - LYL仔仔
  • Godot游戏资源解包神器:5分钟掌握PCK文件提取技巧
  • 2026山东一卡通回收5个通用方法!盘活闲置余额,新手通用攻略 - 可可收公众号
  • Ubuntu 20.04/22.04 下 glog 库的三种安装方式对比:apt、源码编译与 CMake 集成
  • ArcGIS自动矢量化翻车现场:避开这3个坑,你的shp文件才能用
  • 自制电磁场麦克风:从电路原理到电子音乐采样的完整指南
  • Unity项目里实时调用海康威视摄像头画面,保姆级配置流程(附UMP插件避坑指南)
  • 2026工业罗茨风机厂家实测评测:核心指标与服务能力对比 - 奔跑123
  • 2026年江苏高强度紧固件与非标螺栓采购须知:工程机械、石油化工选型避坑指南 - 企业名录优选推荐
  • AI用户反馈冷启动破局方案(含可即用的Prompt审计清单+反馈质量评分卡):仅开放给前500名订阅者
  • 2026年江苏高强度紧固件定制实力较量攻略:非标螺栓/锁紧螺母/美制配件源头工厂选型避坑详解 - 企业名录优选推荐
  • 别再硬编码密码了!Spring Boot多数据源配置加密的‘偷懒’大法:dynamic-datasource事件机制详解
  • 三分钟快速上手B站视频下载:轻松保存4K大会员专属内容
  • 道路护栏网选型技术解析与合规厂家参考 - 奔跑123
  • 从‘相亲配对’到‘外卖派单’:匈牙利算法在生活场景中的花式应用
  • 深度解锁AMD Ryzen性能:SMUDebugTool终极硬件调试指南
  • 2026图文排版终极指南|公众号二维码与编辑器实操教程(新手3步上手) - 鹅鹅鹅ee
  • 从零打造红外遥控Arduino小车:硬件组装、编程与调试全攻略
  • 告别杂乱!免费开源的Windows桌面分区工具NoFences拯救你的工作效率
  • 基于Arduino的智能鞋底消毒系统:从传感器到执行器的物联网实践
  • 2026年 发电机组推荐榜:康明斯/玉柴/高压/大功率,柴油发电机厂家实力口碑深度解析 - 品牌企业推荐师(官方)