算法小知识-------02·11-------滑动窗口

104 阅读2分钟

这是我参与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;
   }

image.png