学生分数的最小差值
Posted China熊孩子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学生分数的最小差值相关的知识,希望对你有一定的参考价值。
学生分数的最小差值
题目链接
题目描述
给你一个 下标从 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 <= nums.length <= 1000
0 <= nums[i] <= 105
题目解法
从 n 个元素里找 k 个,使得 k 个元素最大差值最小 时间复杂度O(nlogn)
这 k 个元素必然是有序数组中(排序后)的连续段。反证法,若最佳 k 个选择不是连续段,能够调整为连续段,结果不会变差。
因此我们可以先对 nums 进行排序,然后扫描所有大小为 k 的窗口,直接找到答案,而无须使用「二分」
public static int minimumDifference(int[] nums, int k)
Arrays.sort(nums);
// 先假设 ans是最小的差
int n = nums.length,ans = nums[k - 1] - nums[0];
for(int i = k; i < n;i++)
//因为是排好序的,前进一位,得到的差再做比较,取最小值
ans = Math.min(ans,nums[i] - nums[i - k + 1]);
return ans;
以上是关于学生分数的最小差值的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode刷题100天—5854. 学生分数的最小差值(双指针)—day22
LeetCode 5854. 学生分数的最小差值(排序+双指针)
第 256 场力扣周赛(状态压缩+dp,二进制子序列的动规940)