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

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

目录

前言

一、题目分析

二、代码

总结


前言

好学好耍


一、题目分析

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

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

二、代码

class Solution {
    public int halveArray(int[] nums) {
        PriorityQueue pq = new PriorityQueue((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;
    }
}


总结

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

你可能感兴趣的:(笨小林做力扣,leetcode,算法)