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

千问 LeetCode 2835. 使子序列的和等于目标的最少操作次数 C语言实现

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

核心思路

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

C 语言实现

```c
int minOperations(int* nums, int numsSize, int target) {
long long totalSum = 0;
int bitCount[32] = {0}; // bitCount[i] 表示 2^i 出现的次数

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

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

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

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

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

// 如果当前位没有可用的 1,需要向高位拆分
while (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/916732/

相关文章:

  • 2026年浙江高强度紧固件定制实测对比干货:非标螺栓/美制螺母源头工厂怎么选? - 企业名录优选推荐
  • 总磷水质在线自动监测仪哪个品牌值得买:基于技术实测与工程案例的行业TOP10深度评估 - 水质仪表品牌排行榜
  • 宁夏旅游旅行社排行 5家合规机构实测对比 - 互联网科技品牌测评
  • 2026年江苏高强度紧固件与非标螺栓甄选对比实录:工程机械、石油化工采购避坑全指南 - 企业名录优选推荐
  • 2026年毕业论文降AI教程:deepseek免费降AI指令+降AI工具测评,高效降低AI率【建议收藏】 - 降AI实验室
  • 终极解决方案:115proxy-for-kodi插件让你在电视上免费观看115云盘视频
  • 新手速成!三步制作微信小程序投票评选活动|亲测火星投票真香 - 微信投票小程序
  • 用Python搞定刚性微分方程:从显式RK4到隐式IRK6的保姆级代码对比
  • 5分钟解锁3DS数字游戏库:从.3ds到CIA的无缝转换指南
  • ChatGPT商业应用实战:从API集成到模型微调,赋能客服、获客与数据分析
  • STM32驱动I2C LCD:从硬件连接到代码调试的完整实践
  • 避坑指南:用WebViewForWindow在Unity放WebRTC视频,绿屏和性能问题怎么解决?
  • 让旧Mac重获新生:OpenCore Legacy Patcher的魔法之旅
  • 2026年浙江高强度紧固件与非标螺栓深度横评:工程机械、石油化工采购选型避坑指南 - 企业名录优选推荐
  • Zotero Style:让你的文献管理体验焕然一新
  • Play Integrity API Checker:3分钟快速检测Android设备安全性的终极方案
  • 2026年 面巾纸折叠机/擦手纸折叠机/棉柔巾折叠机专业厂家推荐榜单:高效稳定与智能耐用机型深度解析 - 品牌企业推荐师(官方)
  • 开源通用I/O控制器SigCore UC实战:从硬件连接到Modbus TCP系统集成
  • 终极PDF处理指南:5分钟掌握MuPDF命令行神器mutool
  • 告别源码编译:用Deb包在Ubuntu 20.04上5分钟快速部署ROS2 Humble
  • RouterOS玩转高级DHCP:巧用Option 60,实现一个Wi-Fi下多业务隔离(访客、IoT、办公)
  • 避坑指南:在MMDetection3D中配置Smoke3D时,Backbone与Neck的关键参数怎么调?
  • 逆向工程实战:如何用OllyDbg动态分析程序中的浮点运算(以CrackMe为例)
  • 天津大商科技官网 - 资讯快报
  • 2026年实用降AIGC软件:亲测AI率从90%降至4%的稳妥方案 - 降AI小能手
  • 树莓派Pico 2 W与OV2640摄像头实现离线图像采集与存储方案
  • Motrix WebExtension:终极浏览器下载加速方案,告别龟速下载时代
  • 保姆级教程:手把手教你监控人大金仓KingbaseES读写分离集群的健康状态(附排查脚本)
  • 无限约束控制屏障函数:理论、算法与工程实践
  • 飞书文档批量导出终极指南:告别繁琐手动下载,25分钟搞定700+文档