第68天(简单题 数据结构)
打卡第六十八天
3道简单题

题目:

思路:

代码:
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); // 递归调整
}
}
};
耗时≈一小时 明天继续

浙公网安备 33010602011771号