leetcode 2208 将数组和减半的最少操作次数
一、题目描述



二、解题思路
整体思路
可以采用贪心算法来解决这个问题,每次都对当前数组中最大的数进行减半操作,以此得到的操作次数就是最小的操作次数。我们可以用大根堆来高效率找到当前数组中最大的元素,进行操作。
具体思路
(1)首先,遍历nums数组,将nums数组中的元素进堆,并将元素累加,sum/2为至少需要减去的数;
(2)当sum>0时,进行循环:
<1>首先,将堆顶元素取出(最大的元素),t为heap.top()/2.0,即为本次操作需要减去的数。再将堆顶元素弹出;
<2>然后,更新sum为sum-t,将计数器count++,再将本次操作完后的变量t入堆;
(3)循环结束后返回count,即为所求。
三、代码实现
class Solution {
public:int halveArray(vector<int>& nums) {//贪心算法+大根堆priority_queue<double> heap;double sum=0.0;//进堆for(auto x:nums){heap.push(x);sum+=x;}sum/=2.0;int count=0;while(sum>0){double t=heap.top()/2.0;heap.pop();sum-=t;count++;heap.push(t);}return count;}
};