依旧完成英语单词和力扣题 ==》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;
}
}
总结
没事干就学习,机会是留给有准备的人的!!!! ^=^.