LeetCode 910.最小差值(贪心,转化)

这篇博客探讨了一道编程题目,涉及到排序和贪心算法的应用。通过排序数组,然后枚举临界点来调整数组元素,使得最大值与最小值之间的差距最小。算法时间复杂度为O(n log n)。文章详细解释了思路和实现代码,适合对算法感兴趣的读者学习。
摘要由CSDN通过智能技术生成

题目

思路

 这道题虽然能明确想到是贪心思想,但是具体的算法不容易想到。首先为了能直观快速找到经过处理后数组的最大值和最小值,需要对数组进行排序。之后再考虑的时候应该尽量上较小的值变大,较大的值变小(使它们更加接近)。这里的变大变小应该从区间的角度思考,即某一个区间的值全部变大,后面区间的值全部缩小(这里很难给出严谨的证明,但是如果不考虑区间,只考虑原有的最大最小值或类似算法很难考虑到所有情况)。所以需要枚举增大区间和减小区间的临界点(即遍历数组),因为当前数组已经排序,所以处理过后的数组最大值在两端数组的极大值中产生,最小值在两端数组中的极小值中产生。算法时间复杂度为O(nlog(n)

代码

class Solution:
    def smallestRangeII(self, A: List[int], K: int) -> int:
        A.sort()
        n=len(A)
        k=K
        if n==1:
            return 0
        ans=float('inf')
        for i in range(n-1):
            maxx=max(A[i]+k,A[n-1]-k)
            minn=min(A[0]+k,A[i+1]-k)
            ans=min(ans,maxx-minn)
        ans=min(ans,A[n-1]-A[0])  #这里是特殊情况,相当于整个数组都上移或下移,相当于没有变化,此时的最大最小值不变
        return ans

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值