点击直接跳转到该题目
目录
1️⃣题目描述
给你一个正整数数组 nums
。每一次操作中,你可以从 nums
中选择 任意 一个数并将它减小到 恰好 一半。(注意,在后续操作中你可以对减半过的数继续执行操作)
请你返回将 nums
数组和 至少 减少一半的 最少 操作数。
示例 1:
示例 2:
注意:
1 <= nums.length <= 105
1 <= nums[i] <= 107
2️⃣题目解析
本题不是很复杂,并没有很明显的使用贪心策略,只是简单的使用优先队列(堆)来动态地获取数组中的最大值
,并将其逐步减半,直到元素的和不超过原始数组元素和的一半。
3️⃣解题代码
class Solution {
public:
int halveArray(vector<int>& nums) {
priority_queue<double> heap;
double sum = 0.0;
int count = 0;
for(int x : nums)
{
heap.push(x);
sum += x;
}
sum /= 2;
while(sum > 0)
{
double tmp = heap.top() / 2.0;
sum -= tmp;
heap.pop();
count++;
heap.push(tmp);
}
return count;
}
};
最后就通过啦: