Given an array A of integers, for each integer A[i] we need to choose either x = -K or x = K, and add x to A[i] (only once).
After this process, we have some array B.
Return the smallest possible difference between the maximum value of B and the minimum value of B.
Example 1:
Input: A = [1], K = 0
Output: 0
Explanation: B = [1]
Example 2:
Input: A = [0,10], K = 2
Output: 6
Explanation: B = [2,8]
Example 3:
Input: A = [1,3,6], K = 3
Output: 3
Explanation: B = [4,6,3]
Note:
1 <= A.length <= 10000
0 <= A[i] <= 10000
0 <= K <= 10000
Solution:
A[0]-K,A[0]+K
…
A[i]-K,A[i]+K
A[i+1]-K,A[i+1]+K
…
A[len-1]-K,A[len-1]+K
A[0]-K and A[len-1]+K won’t have effects in the final range. The final lower bound will be one of (A[0]+K, A[i]-K, A[i+1]-K) and the final upper bound will be one of (A[i]+K, A[i+1]+K, A[len-1]-K). But for different timestamp, the combination is different.
i=0, lower bound: (A[0]+K, A[1]-K) upper bound:(A[0]+K, A[len-1]-K)
i=1, lower bound: (A[0]+K, A[2]-K) upper bound:(A[1]+K, A[len-1]-K)
…
i=len-2, lower bound: (A[0]+K, A[len-1]-K) upper bound:(A[len-2]+K, A[len-1]-K)
So the code is:
class Solution:
def smallestRangeII(self, A, K):
la = len(A)
if (la == 0):
return 0
A.sort()
res = A[la-1]-A[0]
for i in range(la-1):
mi = min(A[0]+K,A[i+1]-K)
ma = max(A[la-1]-K, A[i]+K)
res = min(ma-mi, res)
return res
Typical wrong idea is finding a median. We should come up with a bad case quickly and think towards the right way.