这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战
题解
这道题的难度是简单题,首先我们来分析一下题目,题目中要求我们从数组中选出任意 k 名学生的分数,使这 k 个分数间 最高分 和 最低分 的 差值 达到 最小化 。返回可能的最小差值,选择的K个学生中,我们需要使得最高分和最低分的差值最小化的方法就是意味着最高分和最低分是接近的,我们可以忽视[k-1,k-2,...,1]这中间的数值,那么我们如何找到分数接近的最高分和最低分呢?使用排序,我们可以把整个数组进行排序,排序完成的数值,它们在固定的k值区间内是保持这最小的差值的,按照k值的区间,锁定区间的最高分与最低分,记录遍历的查询,选择最小的差值进行保存即可。
示例代码如下:
class Solution {
public int minimumDifference(int[] nums, int k) {
if (k == 1) {
return 0;
}
Arrays.sort(nums);
int ans = Integer.MAX_VALUE;
for (int i = nums.length - 1; i >= k - 1; i--) {
int a = nums[i];
int b = nums[i - k + 1];
ans = Math.min(a - b, ans);
}
return ans;
}
}
复杂度分析
时间复杂度:O(nlogn),其中 nn 是数组 nums 的长度。排序需要的时间为 OO(nlogn),后续遍历需要的时间为 O(n)O(n)。
空间复杂度:O(logn),即为排序需要使用的栈空间。
注意点
不要单单认为只需要位于最高位的差值就可以了,我在第一次提交的时候,认为排序后,只需要计算最高值与其k值区间内的最低值的差值进行返回就可以了。示例代码如下:
class Solution {
public int minimumDifference(int[] nums, int k) {
if (k == 1) {
return 0;
}
Arrays.sort(nums);
int n = nums.length;
return nums[n - 1] - nums[n - k];
}
}
总结
做题的时候一定要认真审题,确定题目的真正含义,才可以开始做题,做完题目后也需要认真的检查代码的逻辑,思考极端的例子。