【LeetCode每日一题】——1984.学生分数的最小差值

一【题目类别】

  • 滑动窗口

二【题目难度】

  • 简单

三【题目编号】

  • 1984.学生分数的最小差值

四【题目描述】

  • 给你一个 下标从 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

六【题目提示】

  • 1 < = k < = n u m s . l e n g t h < = 1000 1 <= k <= nums.length <= 1000 1<=k<=nums.length<=1000
  • 0 < = n u m s [ i ] < = 1 0 5 0 <= nums[i] <= 10^5 0<=nums[i]<=105

七【解题思路】

  • 此题比较简单,我们首先对数组进行排序,因为之后排序过后,才能更方便的确定最大值和最小值的差值,否则时间复杂度会非常高从而导致超时
  • 然后利用滑动窗口的思想,维护一个长度为k的“窗口”,每次我们都计算这个“窗口”中的最大值和最小值的差值,然后比较得到整个数组的最大值和最小值的差值,一直到“窗口”滑动到数组结尾结束
  • 最后返回结果即可

八【时间频度】

  • 时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn),其中 n n n为传入的数组的长度
  • 空间复杂度: O ( l o g n ) O(logn) O(logn),其中 n n n为传入的数组的长度

九【代码实现】

  1. Java语言版
class Solution {
    
    
    public int minimumDifference(int[] nums, int k) {
    
    
        Arrays.sort(nums);
        int res = nums[k - 1] - nums[0];
        for(int i = k;i<nums.length;i++){
    
    
            res = Math.min(res,nums[i] - nums[i - k + 1]);
        }
        return res;
    }
}
  1. C语言版
int compare(int* a,int *b)
{
    
    
    return *(int *)a - *(int *)b;
}

int minimumDifference(int* nums, int numsSize, int k)
{
    
    
    qsort(nums,numsSize,sizeof(int),compare);
    int res = nums[k - 1] - nums[0];
    for(int i = k;i<numsSize;i++)
    {
    
    
        res = fmin(res,nums[i] - nums[i - k + 1]);
    }
    return res;
}
  1. Python语言版
class Solution:
    def minimumDifference(self, nums: List[int], k: int) -> int:
        nums.sort()
        return min(nums[i] - nums[i - k + 1] for i in range(k - 1,len(nums)))
  1. C++语言版
class Solution {
    
    
public:
    int minimumDifference(vector<int>& nums, int k) {
    
    
        sort(nums.begin(),nums.end());
        int res = nums[k - 1] - nums[0];
        for(int i = k;i<nums.size();i++)
        {
    
    
            res = min(res,nums[i] - nums[i - k + 1]);
        }
        return res;
    }
};

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. C语言版
    在这里插入图片描述

  3. Python语言版
    在这里插入图片描述

  4. C++语言版
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/IronmanJay/article/details/129906991