【Python题解】100231. 超过阈值的最少操作数 I
超过阈值的最少操作数 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 <= 501 <= nums[i] <= 10^91 <= k <= 10^9- 输入保证至少有一个满足
nums[i] >= k的下标i存在。
解题思路
要解决这个问题,首先需要对数组 nums 进行排序。排序后,数组中的最小元素将位于数组的起始位置。从数组的最小端开始,每遇到一个小于 k 的元素,就将其删除,并将操作计数器加一。当遇到第一个大于或等于 k 的元素时,停止删除操作。
给定一个从 0 开始的整数数组 nums 和一个整数 k,目的是通过最少的操作次数使数组中的所有元素都大于或等于 k。操作定义为删除数组中的最小元素。
算法步骤
- 对数组
nums进行排序。 - 初始化操作计数器为
0。 - 遍历排序后的数组,对于每个小于
k的元素,增加操作计数。 - 当遇到第一个大于或等于
k的元素时,停止遍历。 - 返回操作计数。
解决方案
算法思路
- 排序数组:首先将数组排序,这样可以确保我们总是在执行操作时删除最小的元素。
- 计数操作:从数组的最小端开始,对于每个小于
k的元素,我们将其删除,并增加操作计数器。 - 停止条件:当数组中所有剩余的元素都大于或等于
k时,操作结束。
算法步骤
- 对数组
nums进行排序。 - 初始化一个操作计数器。
- 遍历排序后的数组,对于每个小于
k的元素,增加操作计数。 - 当遇到第一个大于或等于
k的元素时,停止遍历。 - 返回操作计数。
代码实现
1 | def min_operations(nums, k): |
测试用例
1 | print(min_operations([2, 11, 10, 1, 3], 10)) # 应输出: 3 |
复杂度分析
- 时间复杂度:O(n log n),主要由排序步骤决定。
- 空间复杂度:O(n) 或 O(1),取决于所使用的排序算法。如果使用原地排序算法,空间复杂度可以降低到 O(1)。
结论
这个解决方案通过排序和简单的线性遍历,有效地找出了将数组中所有元素变得大于或等于 k 所需的最少操作次数。它适用于不同的输入场景,并且在时间和空间效率方面表现良好。