第68天(简单题 数据结构)

打卡第六十八天
3道简单题
image

题目:
image

思路:
image

代码:

class Solution {
public:
    long long pickGifts(vector<int>& gifts, int k) {
        int n = gifts.size();
        for (int i = n/2 - 1; i >= 0; i--) {
            heapify(gifts, n, i);
        }
        for (int i = 0; i < k && gifts[0] > 1; i++) {
            int maxVal = gifts[0];      // 堆顶就是最大值
            int newVal = sqrt(maxVal);  // 计算平方根
            gifts[0] = newVal;          // 替换堆顶
            heapify(gifts, n, 0);       // 从堆顶开始调整
        }
        long long sum = 0;
        for (int val : gifts) {
            sum += val;
        }
        return sum;
    }
    
private:
    void heapify(vector<int>& arr, int n, int i) {
        int largest = i;        // 假设当前节点最大
        int left = 2 * i + 1;   // 左子节点
        int right = 2 * i + 2;  // 右子节点
        if (left < n && arr[left] > arr[largest]) {// 左子节点存在且比当前节点大
            largest = left;
        }
        if (right < n && arr[right] > arr[largest]) {// 右子节点存在且比当前节点大
            largest = right;
        }
        if (largest != i) {// 如果最大值不是当前节点,交换并继续堆化
            swap(arr[i], arr[largest]);  // 交换
            heapify(arr, n, largest);    // 递归调整
        }
    }
};

耗时≈一小时 明天继续

posted @ 2025-12-27 23:45  Wy0518  阅读(1)  评论(0)    收藏  举报