# 910. Smallest Range II 最小差值 II

@TOC

## # 题目描述

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. 1 <= A.length <= 10000
2. 0 <= A[i] <= 10000
3. 0 <= K <= 10000

## # 解题方法

Python代码如下：

``````class Solution(object):
def smallestRangeII(self, A, K):
"""
:type A: List[int]
:type K: int
:rtype: int
"""
A.sort()
N = len(A)
mn, mx = A[0], A[-1]
res = mx - mn
for i in range(N - 1):
mx = max(A[i] + 2 * K, mx)
mn = min(A[i + 1], A[0] + 2 * K)
res = min(mx - mn, res)
return res
``````

C++代码如下：

``````class Solution {
public:
int smallestRangeII(vector<int>& A, int K) {
sort(A.begin(), A.end());
const int N = A.size();
int mn = A[0], mx = A[N - 1];
int res = mx - mn;
for (int i = 0; i < N - 1; i ++) {
mx = max(mx, A[i] + 2 * K);
mn = min(A[i + 1], A[0] + 2 * K);
res = min(res, mx - mn);
}
return res;
}
};
``````

## # 日期

2018 年 12 月 14 日 —— 12月过半，2019就要开始