当前位置: 首页 > 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.gsyq.cn/news/1428046.html

相关文章:

  • 宁夏旅游旅行社排行 5家合规机构实测对比 - 互联网科技品牌测评
  • 新手速成!三步制作微信小程序投票评选活动|亲测火星投票真香 - 微信投票小程序
  • 用Python搞定刚性微分方程:从显式RK4到隐式IRK6的保姆级代码对比
  • ChatGPT商业应用实战:从API集成到模型微调,赋能客服、获客与数据分析
  • 2026年浙江高强度紧固件与非标螺栓深度横评:工程机械、石油化工采购选型避坑指南 - 企业名录优选推荐
  • Play Integrity API Checker:3分钟快速检测Android设备安全性的终极方案
  • RouterOS玩转高级DHCP:巧用Option 60,实现一个Wi-Fi下多业务隔离(访客、IoT、办公)
  • 2026年实用降AIGC软件:亲测AI率从90%降至4%的稳妥方案 - 降AI小能手
  • 天津大商科技官网 - 资讯快报
  • 无限约束控制屏障函数:理论、算法与工程实践
  • 抖音无水印视频下载终极指南:douyin_downloader完整使用教程
  • 三步打造你的专属宝可梦世界:Universal Pokemon Randomizer ZX完全指南
  • 智能游戏管家:如何用OnmyojiAutoScript彻底解放你的阴阳师游戏时间
  • 深度解密LangChain与RAG:从零构建智能衣答系统,掌握大模型本地知识库的终极奥义
  • Pearcleaner:彻底解决macOS应用残留问题的智能清理专家
  • 从数字电路到生活创意:用CD4081与门芯片打造智能小夜灯
  • Windows 11自带的Hyper-V,到底值不值得开?手把手教你从启用到创建第一个Linux虚拟机
  • PDFelement(万兴PDF专家绿色版) v12.1.21.4239 中文便携版
  • 拯救你的机械键盘:告别连击困扰的终极软件方案
  • 提示工程实战指南:四大核心技法与高阶策略提升AI协作效率
  • dnSpy完整指南:为什么它是.NET逆向工程的最佳选择?
  • 2026年氨氮水质在线自动监测仪十大品牌深度评测:技术突围与场景化选型全指南 - 水质仪表品牌排行榜
  • Figma中文插件终极指南:告别英文界面,用母语流畅设计
  • 电脑小白也能懂的VHD安装Win7/8/10/11全攻略:从创建虚拟盘到一键还原菜单设置
  • 智能象棋感知系统:让深度学习AI成为您的专属棋局分析师
  • 基于视觉暂留原理的旋转LED全息投影仪设计与实现
  • 创客DIY:用蠕动泵改造可穿戴泡泡机,成本不到50美元
  • 基于MQTT与Node.js的树莓派远程拍照系统实战
  • 手把手教你用Python和PyTorch处理RML2018.01A数据集(含时频域转换与信噪比筛选)
  • 英雄联盟国服免费换肤工具R3nzSkin:解锁全皮肤体验的专业指南