908. Smallest Range I
题目链接
题目分析
给定一个数组A
和一个数字K
,找到一个在-K
和K
之间的数字x
并加到数组A
中的每一个元素生成数组B
,返回数组B
中最大值和最小值之差最小的值。
思路
根据题目,需要我们可以给数组A
中的每一个元素添加-K<=x<=K
中的任何一个整数,使新生成的数组B
的最大值和最小值之差最小。
怎么使最大值和最小值之差最小呢?
最大值和最小值越接近中间值,最大值和最小值之差最小。
举个例子:A = [-3, 1, 3, 5, 4, 6], K = 3
先求中间值:$mid = ceil((max($A)+min($A))/2)
。(-3+6)/2
再向上取整为2
。
再遍历每个元素。
第0个:-3
要向上方求到的2
靠拢,需要加2-(-3)=5
。然而5>(K=3)
。那么只能加K
的最大值3
了。-3+3=0
;
第1个:1
要向2
靠拢,需要1
,-K<=1<=K
,1+1=2
;
第2个:3
,-K<=-1<=K
,3-1=2
;
第3个:5
,-K<=-3<=K
,5-3=2
;
第4个:4
,-K<=-2<=K
,4-2=2
;
第5个:6
,-4<(-K=3)
,取最小值-3
,6-3=3
。
我们于是得到数组B = [0,2,2,2,2,3]
。最大值和最小值之差为3-0=3
。
最终代码
<?php
class Solution {
function smallestRangeI($A, $K) {
$mid = max($K,ceil((max($A)+min($A))/2));
$b = [];
foreach($A as $a){
if($a-$mid>$K && $a>=$mid){
$b[] = $a-$K;
}
else if($a-$mid<$K&&$a>=$mid){
$b[] = $mid;
}
else if($mid-$a<$K && $a<$mid){
$b[] =$mid;
}
else if($mid-$a>$K && $a<$mid){
$b[] = $a+$K;
}
}
return max($b)-min($b);
}
}
若觉得本文章对你有用,欢迎用爱发电资助。