一、题⽬链接
2208.将数组和减半的最小操作次数
二、解法(贪⼼)
贪⼼策略:
a. 每次挑选出「当前」数组中「最⼤」的数,然后「减半」;
b. 直到数组和减少到⾄少⼀半为⽌。
但是如果我们每次找到最大的元素都要进行遍历,效率有些低下
为了「快速」挑选出数组中最⼤的数,我们可以利⽤「堆」这个数据结构。
三、C++ 算法代码:
class Solution {
public:
int halveArray(vector<int>& nums) {
//定义一个大根堆
priority_queue<double> maxheap;
double sum=0;
for(auto i:nums)
{
maxheap.push(i);
sum+=i;
}
sum/=2;//求出我们要计算的目标,数组大小减半
int count=0;
while(sum>0)
{
// 依次取出堆顶元素减半,直到减到之前的⼀半以下
double t=maxheap.top()/2.0;
maxheap.pop();
sum-=t;
count++;
maxheap.push(t);
}
return count;
}
};