Leetcode 910 Smallest Range II

给定一个整数数组 A,对于每个整数 A[i],我们可以选择 x = -K 或是 x = K,并将 x 加到 A[i] 中。
在此过程之后,我们得到一些数组 B。
返回 B 的最大值和 B 的最小值之间可能存在的最小差值。

示例 1:
输入:A = [1], K = 0
输出:0
解释:B = [1]

示例 2:
输入:A = [0,10], K = 2
输出:6
解释:B = [2,8]

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

提示:

  1. 1 <= A.length <= 10000
  2. 0 <= A[i] <= 10000
  3. 0 <= K <= 10000

题意分析:
对于每个A[i],我们需要将其加上k或者减掉k,使得最后数组中的最大最小值最接近

思路:
初步想法肯定把大的减小,把小的增大,最次也是同时增大或者同时减小,不存在把小的减小反而把大的增大,想到这一步就好做了
我们先将A排序,然后将若干个大的减小,剩下的小的增大,但是具体将多少个大的减小呢,这个我们不能确定,所以我们得依次遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution(object):
def smallestRangeII(self, A, K):
A.sort()
# 初始默认全部加k
for i in range(len(A)): A[i] += K
# 使用ma,mi保存当前的最大和最小值
ma, mi = A[-1], A[0]
res = ma - mi
# M代表-k的那部分数中的最大值
# m代表+k的那部分数中的最小值
M,m = ma-2*K,mi
for i in range(len(A)-1,0,-1):
A[i] -= 2*K
ma = max(M, A[i-1])
mi = min(A[i], m)
res = min(res, ma - mi)
return res