要想最小化选择的 k 名学生中最高分和最低分的差值,我们一定是在排好序后的数组中连续地进行选择。这是因为在选择时,如果跳过了某个下标 i,那么在选择完毕后,将其中的最高分替换成 nums}[i],最高分一定不会变大,与最低分的差值同样也不会变大。因此,一定存在有一种最优的选择方案,是连续选择了有序数组中的 k 个连续的元素。
这样一来,我们首先对数组 nums 进行升序排序,随后使用一个大小固定为 k 的滑动窗口在 nums 上进行遍历。记滑动窗口的左边界为 i,那么右边界即为 i+k-1,窗口中的 k 名学生最高分和最低分的差值即为 nums}[i+k-1] - \textit{nums}[i]。
最终的答案即为所有 nums}[i+k-1] - \textit{nums}[i] 中的最小值。
代码
[sol1-C++]
1 2 3 4 5 6 7 8 9 10 11 12
classSolution { public: intminimumDifference(vector<int>& nums, int k){ int n = nums.size(); sort(nums.begin(), nums.end()); int ans = INT_MAX; for (int i = 0; i + k - 1 < n; ++i) { ans = min(ans, nums[i + k - 1] - nums[i]); } return ans; } };
[sol1-Java]
1 2 3 4 5 6 7 8 9 10 11
classSolution { publicintminimumDifference(int[] nums, int k) { intn= nums.length; Arrays.sort(nums); intans= Integer.MAX_VALUE; for (inti=0; i + k - 1 < n; ++i) { ans = Math.min(ans, nums[i + k - 1] - nums[i]); } return ans; } }
[sol1-C#]
1 2 3 4 5 6 7 8 9 10 11
publicclassSolution { publicintMinimumDifference(int[] nums, int k) { int n = nums.Length; Array.Sort(nums); int ans = int.MaxValue; for (int i = 0; i + k - 1 < n; ++i) { ans = Math.Min(ans, nums[i + k - 1] - nums[i]); } return ans; } }
[sol1-Python3]
1 2 3 4
classSolution: defminimumDifference(self, nums: List[int], k: int) -> int: nums.sort() returnmin(nums[i + k - 1] - nums[i] for i inrange(len(nums) - k + 1))
intminimumDifference(int* nums, int numsSize, int k){ qsort(nums, numsSize, sizeof(int), cmp); int ans = INT_MAX; for (int i = 0; i + k - 1 < numsSize; ++i) { ans = MIN(ans, nums[i + k - 1] - nums[i]); } return ans; }
[sol1-JavaScript]
1 2 3 4 5 6 7 8 9
var minimumDifference = function(nums, k) { const n = nums.length; nums.sort((a, b) => a - b); let ans = Number.MAX_SAFE_INTEGER; for (let i = 0; i < n - k + 1; i++) { ans = Math.min(ans, nums[i + k - 1] - nums[i]); } return ans; };
[sol1-Golang]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
funcminimumDifference(nums []int, k int)int { sort.Ints(nums) ans := math.MaxInt32 for i, num := range nums[:len(nums)-k+1] { ans = min(ans, nums[i+k-1]-num) } return ans }
funcmin(a, b int)int { if a > b { return b } return a }