「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」。
题目
给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数。另给你一个整数 k 。
从数组中选出任意 k 名学生的分数,使这 k 个分数间 最高分 和 最低分 的 差值 达到 最小化 。
返回可能的 最小差值 。
示例 1:
输入:nums = [90], k = 1
输出:0
解释:选出 1 名学生的分数,仅有 1 种方法:
- [90] 最高分和最低分之间的差值是 90 - 90 = 0 可能的最小差值是 0
示例 2:
输入:nums = [9,4,1,7], k = 2
输出:2
解释:选出 2 名学生的分数,有 6 种方法:
- [9,4,1,7] 最高分和最低分之间的差值是 9 - 4 = 5
- [9,4,1,7] 最高分和最低分之间的差值是 9 - 1 = 8
- [9,4,1,7] 最高分和最低分之间的差值是 9 - 7 = 2
- [9,4,1,7] 最高分和最低分之间的差值是 4 - 1 = 3
- [9,4,1,7] 最高分和最低分之间的差值是 7 - 4 = 3
- [9,4,1,7] 最高分和最低分之间的差值是 7 - 1 = 6 可能的最小差值是 2
思路
滑动窗口的题目,这题也挺简单的。
要让k个学生的最高分和最低分之间的差值尽可能小,就是需要这k个学生的分数尽可能聚集。换句话说,就是这k个学生的分数一定是连续的。证明可以使用反正法,我们用一段连续的k个分数,最小值记为min,最大值记为max,差值为max-min。任何一个分数值修改成这一段之外的分数,name换进来的分数要么大于等于max,要么小于等于min,所以差值必然大于等于max-min。
所以我们可以先对这k个分数进行排序,然后用滑动窗口框定一段长度为k的,从左到右滑动,分别计算出每个窗口最大值和最小值的差,要求的解就是这些差值的最小值。
Java版本代码
class Solution {
public int minimumDifference(int[] nums, int k) {
Arrays.sort(nums);
int ans = Integer.MAX_VALUE;
for (int i = 0; i <= nums.length-k; i++) {
int temp = nums[i+k-1] - nums[i];
ans = Integer.min(ans, temp);
}
return ans;
}
}