贪心算法-2208.将数组和减半的最小操作数-力扣(LeetCode)

一、题目解析

这里要注意恰好这个字眼,说明对任意数减小一半是不需要向上取整的,所以我们需要定义double类型的数据。

二、算法解析

我们需要将数组和减小为一半的次数最少,所以根据贪心算法,我们需要取数组中最大的数进行减半操作 ,但最优解也许不是每次都选择最大数进行减半操作,为什么贪心解就是正确的解呢?这个会在最后证明。

解法:贪心+大根堆

由于每次需要取最大的数进行 减半操作,我们可以使用大根堆来存储数据。

统计数组和的同时将数据插入到大根堆中,top出最大的数对其减半,然后pop掉原来数据,并将减半后的数重新插入回去,计数器++,然后重复这样的行为直到数组和减少到至少一半为止。

这里的大根堆使用 priority_queue容器。

根据上面的解析先自己编写代码,链接:2208. 将数组和减半的最少操作次数 - 力扣(LeetCode)

三、代码示例

cpp 复制代码
class Solution {
public:
    int halveArray(vector<int>& nums) {
        priority_queue<double> maxHeap;//大根堆
        double sum1 = 0.0;//sum1是原本的数组和
        for(auto e : nums)
        {
            maxHeap.push(e);//插入元素
            sum1 += e;
        }
        double sum2 = sum1;//sum2是减半后的数组和
        int count = 0;
        while((sum1 - sum2) < (sum1/2))//当减小的部分大于或等于sum1的一半时,循环结束
        {
            double tmp = maxHeap.top();//获取堆顶元素
            maxHeap.pop();//删除堆顶元素
            sum2 -= tmp;
            sum2 += (tmp/2);
            maxHeap.push(tmp/2);
            count++;//计数器
        }

        return  count;
    }
};

四、证明

证明方法:交换论证法

看到最后,如果对您有所帮助还请留下一个免费的赞和收藏,小编感激不尽,期待我们下期再见!

相关推荐
yi01113 分钟前
LeetCode 643. 子数组最大平均数 I|从暴力枚举到滑动窗口
人工智能·笔记·python·算法·leetcode·滑动窗口
无忧.芙桃35 分钟前
C++语言原理与实践(十二):list类的底层实现
c++·windows·list
沫璃染墨37 分钟前
《Linux工程实践篇(二):线程池实战——从线程安全单例到完整源码实现》
linux·开发语言·c++·单例模式·设计模式·系统架构
极光通讯43 分钟前
服务器内存来料检验(IQC)实操:批次追溯、外观判定与上机验证
java·服务器·算法
淡海水1 小时前
02-04-原理篇-GC Roots与对象图遍历
算法·unity·c#·图·gc·遍历·roots
ClickHouseDB1 小时前
ClickHouse 大规模 OpenTelemetry 数据接入架构的可靠性演进
算法
有只小白叫岳飒1 小时前
c++智能指针 unique_ptr与函数调用
c++
Shaoshing1 小时前
BHU 润石工作室 251019自建赛题解
算法
Leo.yuan1 小时前
Kafka+Flink拼凑,还是FineDataLink 5.0一体化?实时数据处理的两种思路
c++·mfc
玩AI的奶茶1 小时前
24GB 显存能跑多大的模型?参数量、精度与显存占用对照表
人工智能·python·算法·ai·aigc·gpu算力·算力租赁