力扣原題鏈接,點擊跳轉。
給你一個數組,每次可以把其中一個數減半,可以對同一個數多次減半。至少操作多少次,才能讓數組的和整體減少至少一半呢?
我們每次都選擇當前數組中最大的那個數減半,就能減少最多,這就是貪心策略。可以創建一個大根堆,堆頂元素就是最大的那個數。每次取堆頂元素,減半后再入堆即可。
class Solution
{
public:int halveArray(vector<int>& nums){priority_queue<double> heap;double sum = 0.0;// 入堆并求和for (auto num : nums){sum += num;heap.push(num);}int cnt = 0;sum /= 2;while (sum > 0){// 一次減半double t = heap.top() / 2;sum -= t;cnt++;heap.pop();heap.push(t);}return cnt;}
};