1509. 三次操作后最大值与最小值的最小差
大约 3 分钟
---
1509. 三次操作后最大值与最小值的最小差
- 标签:贪心、数组、排序
- 难度:中等
题目链接
题目大意
描述:给定一个数组 。最多可以进行 次操作,每次操作可以将任意一个元素改成任意值。
要求:返回经过最多 次操作后,数组最大值与最小值之间可能的最小差值。
说明:
- 。
- 。
示例:
- 示例 1:
输入:nums = [5,3,2,4]
输出:0
解释:我们最多可以走 3 步。
第一步,将 2 变为 3 。 nums 变成 [5,3,3,4] 。
第二步,将 4 改为 3 。 nums 变成 [5,3,3,3] 。
第三步,将 5 改为 3 。 nums 变成 [3,3,3,3] 。
执行 3 次移动后,最小值和最大值之间的差值为 3 - 3 = 0 。- 示例 2:
输入:nums = [1,5,0,10,14]
输出:1
解释:我们最多可以走 3 步。
第一步,将 5 改为 0 。 nums变成 [1,0,0,10,14] 。
第二步,将 10 改为 0 。 nums变成 [1,0,0,0,14] 。
第三步,将 14 改为 1 。 nums变成 [1,0,0,0,1] 。
执行 3 步后,最小值和最大值之间的差值为 1 - 0 = 1 。
可以看出,没有办法可以在 3 步内使差值变为0。解题思路
思路 1:排序 + 枚举
1. 核心思想
改变一个元素可以消除它成为最大值或最小值的可能性。目标是使最大值和最小值的差尽可能小。
最多改 个元素,相当于我们可以从两侧移除最多 个极值(要么去掉最小的几个,要么去掉最大的几个)。
排序后,枚举所有可能的移除方案:
- 移除最小的 个和最大的 个:跨度 。
- 移除最小的 个和最大的 个:跨度 。
- 移除最小的 个和最大的 个:跨度 。
- 移除最小的 个和最大的 个:跨度 。
取最小值即可。
2. 具体步骤
第 1 步:排序 。如果 ,可以全改成同一个值,差为 。
第 2 步:枚举 :
- 。
第 3 步:返回 。
3. 举例说明
以 为例:
排序后 ,。
- 去 大:,差 。
- 去 小 大:,差 。
- 去 小 大:,差 。
- 去 小:,差 。
最小差 。
以 为例:
排序后 ,。
- 去 大:,差 。
- 去 小 大:,差 。
- 去 小 大:,差 。
- 去 小:,差 。
最小差 。
思路 1:代码
class Solution:
def minDifference(self, nums: List[int]) -> int:
if len(nums) <= 4:
return 0
nums.sort()
n = len(nums)
ans = float('inf')
for i in range(4):
ans = min(ans, nums[n - 4 + i] - nums[i])
return ans思路 1:复杂度分析
- 时间复杂度:,排序。
- 空间复杂度:。