贪心算法二--将数组和减半的最少操作次数

题目链接

一、问题定位

给定正整数数组 nums,每次操作选择当前数组最大元素 并将其减半(支持浮点数),目标是让数组总和减少至少一半 ,求完成目标的最少操作次数


二、核心算法:贪心策略 + 大根堆(最大堆)

  1. 贪心策略逻辑

    要让总和最快减少,每次必须选择当前最大的元素进行减半。因为最大元素的减半对总和的"减幅"最大,能以最少步骤达成目标。

  2. 大根堆的作用

    大根堆可以高效维护当前数组的最大值,支持 O(log n) 时间复杂度的"取出最大值"和"插入更新后的值"操作,保障算法效率。


三、解题步骤

  1. 计算初始总和

    先求出数组所有元素的和 total,目标是让总和减少量 ≥ total / 2(即剩余总和 ≤ total / 2)。

  2. 构建大根堆

    将数组元素存入大根堆,以便快速获取当前最大值。

  3. 迭代执行减半操作

    • 取出堆顶(当前最大值),计算其减半后的值。
    • 将减半后的值重新插入堆中。
    • 累加本次操作的"减少量"(原最大值 - 减半后的值),并记录操作次数。
    • 当累计减少量 ≥ total / 2 时,停止操作并返回次数。

四、正确性证明:交换论证法

  1. 核心思路

    通过"交换操作步骤",证明贪心解与最优解的等价性,从而验证贪心策略的最优性。

  2. 论证逻辑

    • 假设存在一个最优解 OPT,其操作顺序与贪心解 GREEDY 不同。
    • 找到第一个不同的操作位置:OPT 处理了较小元素 y,而 GREEDY 处理了较大元素 xx > y)。
    • OPT 中这次处理 y 的操作替换为处理 x,可证明新解仍满足条件且操作次数不增加。
    • 重复交换,最终可将 OPT 转化为 GREEDY,说明贪心解是最优的。

五、示例验证(图中案例)

输入:nums = [5,19,8,1]

初始总和:5+19+8+1 = 33,目标减少量:33/2 = 16.5

  • 第1次操作:19 → 9.5,减少量 9.5(累计:9.5)
  • 第2次操作:9.5 → 4.75,减少量 4.75(累计:14.25)
  • 第3次操作:8 → 4,减少量 4(累计:18.25 ≥ 16.5)
    最终操作次数为 3,与示例输出一致。

相关推荐
先吃饱再说1 天前
判断回文字符串,从一行代码到双指针优化
算法
黄敬峰1 天前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术1 天前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六1 天前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
胡萝卜术1 天前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
Asize1 天前
初识DFS 与 BFS:递归、队列与图遍历
算法
罗西的思考2 天前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
美团技术团队2 天前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法
To_OC3 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode