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

题目链接

一、问题定位

给定正整数数组 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,与示例输出一致。

相关推荐
hhzz15 分钟前
Tiger AI Platform平台中增加人脸识别功能
图像处理·人工智能·算法·计算机视觉·大模型
从零开始的代码生活_1 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
TsingtaoAI1 小时前
3D高斯泼溅技术发展及其在具身智能领域的应用综述
人工智能·算法·ai·具身智能·高斯泼溅
atunet1 小时前
关于图算法中的连通分量检测与最小割问题7
算法
心运软件2 小时前
银行客户流失预测(Python 完整实战)
算法
邪神与厨二病2 小时前
牛客周赛 Round 153
python·算法
qizayaoshuap4 小时前
# ❌ 井字棋 — 鸿蒙ArkTS Minimax AI算法与博弈系统设计
人工智能·算法·华为·harmonyos
皓月斯语5 小时前
B3842 [GESP202306 三级] 春游 题解
数据结构·c++·算法·题解
atunet5 小时前
树状结构在查询优化中的作用与实现细节7
算法
徐凤年_5 小时前
rog_map参数理解
算法