【LeetCode】1962. 移除石子使总数最小 【贪心】【最大堆】

68 阅读1分钟

题目链接

image.png

image.png

Python3

方法: 贪心 + 最大堆 O(k×logn+n)O(n)\lgroup O(k× \log n + n)、O(n)\rgroup

class Solution:
    def minStoneSum(self, piles: List[int], k: int) -> int:
        ## 构建 最大堆
        heap = [-pile for pile in piles]
        heapify(heap)
        for _ in range(k):
            pile = -heappop(heap)
            pile = pile - pile//2
            heappush(heap, -pile)
        return -sum(heap)

image.png

C++

方法: 贪心 + 最大堆 O(k×logn+n)O(n)\lgroup O(k× \log n + n)、O(n)\rgroup

class Solution {
public:
    int minStoneSum(vector<int>& piles, int k) {
        make_heap(piles.begin(), piles.end());
        for (int i = 0; i < k; ++i){
            pop_heap(piles.begin(), piles.end());
            piles.back() -= piles.back()/2;
            push_heap(piles.begin(), piles.end());
        }
        return reduce(piles.begin(), piles.end(), 0); // 写法 1
        // return accumulate(piles.begin(), piles.end(), 0); // 写法 2
    }
};
class Solution {
public:
    int minStoneSum(vector<int>& piles, int k) {
        priority_queue<int> pq(piles.begin(), piles.end()); // 创建优先队列, 默认最大堆
        for (int i = 0; i < k; ++i){
            int pile = pq.top();
            pq.pop();
            pile -= pile / 2;
            pq.push(pile);
        }
        int res = 0;
        while (!pq.empty()){
            res += pq.top();
            pq.pop();        
        }
        return res;
    }
};