leetcode 908. 最小差值 I

https://leetcode-cn.com/problems/smallest-range-i/submissions/

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200320140337470.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hobXk3Nw==,size_16,color_FFFFFF,t_70

思路:
题目要求找的是处理后最大值和最小值的最小差值
由于我们要找最小差值,那么存在最小差值的这个B数组中,最大值一定是原来A数组的最大值处理得来,同理最小值也是A数组的最小值处理而来
例如

A=1 5 6 7 10,K=3
想要求最小差值,那么最小值尽可能大,最大值尽可能小
可能的一种B=4 * * * 7

中间的*数字小于等于7大于等于4,只要*号处于这个区间,它们对最终结果都没有影响。
而4=1+3,7=10-3
我们发现,B数组的最小值和最大值确实是由A数组的最小最大值处理而来

继续讨论答案等于0的情况
例如样例中的

输入:A = [1,3,6], K = 3
输出:0
解释:B = [3,3,3] 或 B = [4,4,4]

我们发现,A中的最小值处理后的可能取值是[1,2,3,4],最大值处理后的可能取值是[3,4,5,6],其中两个区间中3,4的值相交了
那么我们可以得出这样的结论
如果min+K>=max-K,那么它们的取值区间相交了,一定存在最小值是0的情况
反之,我们只能取到max-K-(min+K)结果

class Solution:
    def smallestRangeI(self, A: List[int], K: int) -> int:
        minNum,maxNum=A[0],A[0]
        for num in A:
            if num>maxNum:
                maxNum=num
            if num<minNum:
                minNum=num
        if minNum+K>=maxNum-K:
            return 0
        else:
            return maxNum-K-(minNum+K)

在这里插入图片描述
进一步我们发现,A的最小值最大值如果差值小于等于2K,那么它们的区间一定是相交的,如果差值大于的话,那就不相交了

class Solution:
    def smallestRangeI(self, A: List[int], K: int) -> int:
        ans=max(A)-min(A)
        return max(0,ans-2*K)

于是上面的代码可以写成这样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值