Every day a Leetcode
题目来源:3066. 超过阈值的最少操作数 II
解法1:模拟
两个 int 类型的数 x 和 y 做操作:min(x, y) * 2 + max(x, y),得到的结果会超出 int 范围。
代码:
/*
* @lc app=leetcode.cn id=3066 lang=cpp
*
* [3066] 超过阈值的最少操作数 II
*/
// @lc code=start
class Solution
{
public:
int minOperations(vector<int> &nums, int k)
{
vector<long long> LLnums;
for (int &num : nums)
LLnums.push_back((long long)num);
int count = 0;
while (*min_element(LLnums.begin(), LLnums.end()) < k && LLnums.size() >= 2)
{
auto it = min_element(LLnums.begin(), LLnums.end());
long long x = *it;
LLnums.erase(it);
it = min_element(LLnums.begin(), LLnums.end());
long long y = *it;
LLnums.erase(it);
count++;
long long add = min(x, y) * 2 + max(x, y);
LLnums.push_back(add);
}
return count;
}
};
// @lc code=end
结果:
解法2:优先队列
用一个最小堆模拟更方便。
代码:
typedef long long LL;
class Solution
{
public:
int minOperations(vector<int> &nums, int k)
{
priority_queue<LL, vector<LL>, greater<>> pq;
for (int &num : nums)
pq.push((LL)num);
int ans = 0;
while (pq.top() < k)
{
LL x = pq.top();
pq.pop();
LL y = pq.top();
pq.pop();
pq.push(min(x, y) * 2 + max(x, y));
ans++;
}
return ans;
}
};
结果:
复杂度分析:
时间复杂度:O(nlogn),其中 n 是数组 nums 的元素个数。
空间复杂度:O(n),其中 n 是数组 nums 的元素个数。