这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战
滑动窗口
滑动窗口本来是计算机网络里面TCP协议的一种应用,本意是用于网络数据传输的流量控制,由接收方和发送方相互确认还需要发送多少数据,数据的发送维持在一个窗口区间。
相对的,滑动窗口的思想不止停留在计算机网络,在日常的业务以及做题里面也会涉及到。例如之前讲过的双指针解法,分为快慢指针和对撞指针。快慢指针的理念不就于滑动窗口的理念有所碰撞吗。而,滑动窗口需要注意的便是窗口的大小与相应的业务逻辑。
学生分数的最小差值
该题出自力扣的1984题 —— 学生分数的最小差值【简单题】
审题
给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数。另给你一个整数 k 。
从数组中选出任意 k 名学生的分数,使这 k 个分数间 最高分 和 最低分 的 差值 达到 最小化 。
返回可能的 最小差值 。
- 题意也比较明确,就是给出一个数组,找出指定个数内的最小值
- 比较容易联想到滑动窗口,但是数组缺乏可序性
- 因此使用排序 + 滑动窗口
- 先对数组进行排序
- 遍历数组,初始值为窗口的指定大小
- 使用一个大小固定为 k 的滑动窗口,对于每次的比较为窗口右侧与i-k+1比较
- 为了使k个数字极差最小,那就顺序取最接近的k个数字
- 比较最小值,直到结束
- 时间复杂度为O(nlogn),排序需要O(nlogn),遍历需要n
- 空间复杂度O(logn)
编码
public int minimumDifference(int[] nums, int k) {
//排序后滑动窗口
Arrays.sort(nums);
int n = nums.length;
int min = nums[k -1] - nums[0];
for (int i = k;i<n;i++){
min = Math.min(min,nums[i] - nums[i-k+1]);
}
return min;
}