系列文章目錄
【拒絕算法PUA】0x00-位運算
【拒絕算法PUA】0x01- 區間比較技巧
【拒絕算法PUA】0x02- 區間合并技巧
【拒絕算法PUA】0x03 - LeetCode 排序類型刷題
【拒絕算法PUA】LeetCode每日一題系列刷題匯總-2025年持續刷新中
C++刷題技巧總結:
[溫習C/C++]0x04 刷題基礎編碼技巧
文章目錄
- 系列文章目錄
- LeetCode 3065. 超過閾值的最少操作數 I
- 鏈接
- 題目
- 解題方法1 (排序,然后for循環判斷)
- 解題方法2(利用小頂堆優化)
LeetCode 3065. 超過閾值的最少操作數 I
鏈接
3065. 超過閾值的最少操作數 I
題目
給你一個下標從 0 開始的整數數組 nums 和一個整數 k 。一次操作中,你可以刪除 nums 中的最小元素。你需要使數組中的所有元素都大于或等于 k ,請你返回需要的 最少 操作次數。示例 1:輸入:nums = [2,11,10,1,3], k = 10
輸出:3
解釋:第一次操作后,nums 變為 [2, 11, 10, 3] 。
第二次操作后,nums 變為 [11, 10, 3] 。
第三次操作后,nums 變為 [11, 10] 。
此時,數組中的所有元素都大于等于 10 ,所以我們停止操作。
使數組中所有元素都大于等于 10 需要的最少操作次數為 3 。
示例 2:輸入:nums = [1,1,2,4,9], k = 1
輸出:0
解釋:數組中的所有元素都大于等于 1 ,所以不需要對 nums 做任何操作。
示例 3:輸入:nums = [1,1,2,4,9], k = 9
輸出:4
解釋:nums 中只有一個元素大于等于 9 ,所以需要執行 4 次操作。提示:1 <= nums.length <= 50
1 <= nums[i] <= 109
1 <= k <= 109
輸入保證至少有一個滿足 nums[i] >= k 的下標 i 存在。
解題方法1 (排序,然后for循環判斷)
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;class Solution {
public:int minOperations(vector<int>& nums, int k) {vector<int> copy(nums.begin(), nums.end());std::sort(copy.begin(), copy.end(), std::less<int>());int ans = 0;int size = nums.size();for (int i =0; i < size; i++) {if (copy[i] >= k) {ans = i;break;}}return ans;}
};int main(int argc, char **argv) {vector<int> vec = {2, 11, 10, 1, 3};int k = 10;Solution obj;int ret = obj.minOperations(vec, k);cout << ret << endl;return 0;
}
輸出:
3
解題方法2(利用小頂堆優化)
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>using namespace std;class Solution {
public:struct cmp {bool operator()(int a, int b) {return a > b; // 小頂堆}};int minOperations(vector<int>& nums, int k) {int ans = 0;priority_queue<int, vector<int>, cmp> pq(nums.begin(), nums.end());while (!pq.empty() && pq.top() < k) {pq.pop();}ans = nums.size() - pq.size();return ans;}
};