1509. 三次操作后最大值与最小值的最小差-快速排序+局部滑动窗口,力扣双百代码
给你一个数组 nums ,每次操作你可以选择 nums 中的任意一个元素并将它改成任意值。
请你返回三次操作后, nums 中最大值与最小值的差的最小值。
示例 1:
输入:nums = [5,3,2,4]
输出:0
解释:将数组 [5,3,2,4] 变成 [2,2,2,2].
最大值与最小值的差为 2-2 = 0 。
示例 2:
输入:nums = [1,5,0,10,14]
输出:1
解释:将数组 [1,5,0,10,14] 变成 [1,1,0,1,1] 。
最大值与最小值的差为 1-0 = 1 。
示例 3:
输入:nums = [6,6,0,1,1,4,6]
输出:2
示例 4:
输入:nums = [1,5,6,14,15]
输出:1
个人觉得对于这个题目很多人可能就觉得,感觉好简单,然后就很快的去做了,但是可能发现没那么轻松,为啥呢,其实如果你暴力求解,事实上,这个题目会讨论很多种情况,但是我们可以先排序,排完序之后,默认一个n-3的有效窗口,求这个窗口的最大值和最小值之差,解题代码如下:
void quick(int *a,int low,int high){
if(low<high){
int l=low,h=high,p=a[low];
while(low<high){
while(a[high]>=p&&low<high){
high--;
}
a[low]=a[high];
while(a[low]<=p&&low<high){
low++;
}
a[high]=a[low];
}
a[low]=p;
quick(a,l,low-1);
quick(a,low+1,h);
}
}
int minDifference(int* nums, int numsSize){
quick(nums,0,numsSize-1);
if(numsSize<=4){
return 0;
}
int a= fmin(nums[numsSize-1]-nums[3],nums[numsSize-2]-nums[2]);
int b=fmin(nums[numsSize-3]-nums[1],nums[numsSize-4]-nums[0]);
return fmin(a,b);
}