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)
于是上面的代码可以写成这样