2208. 将数组和减半的最少操作次数 力扣!7月26每日一题

文章介绍了如何利用大顶堆(PriorityQueue)解决一个算法问题,即在给定数组中,通过将最大值减半并累加到总和,找到使总和不超过原数组和一半的最小操作次数。作者首先尝试了数组排序,然后意识到需要大顶堆来实现从大到小的选择。提供的解决方案中,创建了一个大顶堆并将所有元素添加进去,然后在循环中不断将堆顶元素减半并更新总和,直到满足条件。
摘要由CSDN通过智能技术生成

依旧完成英语单词和力扣题 ==》2208. 将数组和减半的最少操作次数  

目录

前言

一、题目分析

二、代码

总结


前言

好学好耍


一、题目分析

题目的话,分析一下看起来就很简单,将数组进行排序,从大到小排序,每次将最大的数除以2再和数组中其他的数进行相加,如此操作,若相加求的和小于等于原数组和的一半,则返回操作(每次将最大的数除以2再和数组中其他的数进行相加,如此操作    就是看这个步骤操作了几次而已)的次数,第一次是运用数组排序  =》 Arrays.sort 这个进行排序,结果连测试用例都没通过,错误的问题是这个排序算法是从小到大进行排序的。最后发现了这个错误,修改之后,发现还是不行。看了大佬的解题思路,我才发现我肤浅了,大佬都用的是大顶堆,哭死!!

大顶堆的话,使用到了一个类  ==》 PriorityQueue  里面可以创建小顶堆和大顶堆    我写了一篇文章,可以去看看 ===>> 关于java中PriorityQueue类的使用方法

二、代码

class Solution {
    public int halveArray(int[] nums) {
        PriorityQueue<Double> pq = new PriorityQueue<Double>((a, b) -> b.compareTo(a));
        for (int num : nums) {
            pq.offer((double) num);
        }
        int res = 0;
        double sum = 0;
        for (int num : nums) {
            sum += num;
        }
        double sum2 = 0.0;
        while (sum2 < sum / 2) {
            double x = pq.poll();
            sum2 += x / 2;
            pq.offer(x / 2);
            res++;
        }
        return res;
    }
}


总结

没事干就学习,机会是留给有准备的人的!!!! ^=^.  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值