1509. 三次操作后最大值与最小值的最小差-快速排序+局部滑动窗口,力扣双百代码

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);

}












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值