来源:LeetCode
链接:https://leetcode.cn/problems/minimum-operations-to-exceed-threshold-value-ii/description/?envType=daily-question&envId=2025-01-15
题目:
给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。
一次操作中,你将执行:
选择 nums 中最小的两个整数 x 和 y 。
将 x 和 y 从 nums 中删除。
将 min(x, y) * 2 + max(x, y) 添加到数组中的任意位置。
注意,只有当 nums 至少包含两个元素时,你才可以执行以上操作。
你需要使数组中的所有元素都大于或等于 k ,请你返回需要的 最少 操作次数。
解题思路:
每次取最小的两个数进行操作,这样不满足条件的数字数量最少也会减一,由于每次操作完之后都需要进行插入和排序操作,因此我们选择使用优先队列(小根堆)
ac代码:
class Solution { public: int minOperations(vector<int>& nums, int k) { int ans = 0; priority_queue<long long,vector<long long>,greater<long long>> pq(nums.begin(),nums.end()); while(pq.top() < k){ long long x = pq.top(); pq.pop(); long long y = pq.top(); pq.pop(); pq.push(min(x,y)*2+max(x,y)); ans++; } return ans; } };
注意:
数据范围是:
2 <= nums.length <= 2 * 105
1 <= nums[i] <= 109
1 <= k <= 109
会超出int的范围,所以用long long