一、题干:学生分数的最小差值
难度简单56
给你一个 下标从 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
提示:
- 先从小到大排序;
再滑动窗口,依次比较“相邻的k个数中,最大值-最小值”,最小值即是结果。
func minimumDifference(nums []int, k int) int {
if k==1||len(nums)==1{
return 0
}
//排序
for i:=len(nums)-1;i>0;i-- {
for j:=0;j<i;j++{
if nums[j]>nums[j+1]{
temp:=nums[j]
nums[j]=nums[j+1]
nums[j+1]=temp
}
}
}
//滑动窗口
_min:=int(10e5)
for i:=0;i<=len(nums)-k;i++{
if nums[i+k-1]-nums[i]<_min{
_min=nums[i+k-1]-nums[i]
}
}
return int(_min)
}
好慢。。。。哈哈哈,虽然我很菜,但是这么慢肯定不行的,emmm,好像没有其他途径了,看来只能优化排序了,快排走起~
2. 改进:快排
func minimumDifference(nums []int, k int) int {
if k==1||len(nums)==1{
return 0
}
//升级排序:快排
quickSort(nums,0,len(nums)-1)
//滑动窗口
_min:=int(10e5)
for i:=0;i<=len(nums)-k;i++{
if nums[i+k-1]-nums[i]<_min{
_min=nums[i+k-1]-nums[i]
}
}
return int(_min)
}
func quickSort(arr []int,l,r int) {
if r<=l{
return
}
p, q:= partition(arr, l, r)
quickSort(arr,l,p)
quickSort(arr,q,r)
}
func partition(arr []int, l, r int) (int,int){
flag := arr[(l+r)/2]
p, q := l-1, r+1
for i := l; i <= r&& i != q;{
if arr[i]<flag{
tmp:=arr[p+1]
arr[p+1]=arr[i]
arr[i]=tmp
i++
p++
}else if arr[i]==flag{
i++
}else {
tmp:=arr[q-1]
arr[q-1]=arr[i]
arr[i]=tmp
q--
}
}
return p,q
}
看下结果,哈哈哈,看来单单一个排序优化就能提升很多,效果显著,飞起~