Problem
Given an array A of integers, for each integer A[i] we may choose any x with -K <= x <= K, and add x to A[i].
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:
1 | Input: A = [1], K = 0 |
Example 2:
1 | Input: A = [0,10], K = 2 |
Example 3:
1 | Input: A = [1,3,6], K = 3 |
Note:
1 <= A.length <= 100000 <= A[i] <= 100000 <= K <= 10000
Analysis
这道题目给定了一个数组A和K,要求我们在-K <= x <= K中找到一个x,使得B[i] = x + A[i](不同i可以对应不同x),然后找出B中最大值和最小值的差。于是很自然地想到,对A先进行排序,然后最大值减去-K,最小值加上K,从直观上将,这会使得最大的数最大程度地减小,使得最小的数最大程度地增加,他们之间的差就是最小的。
提交代码后发现有错,错误的原因是,如果处理后,最大值减去K<最小值加上K,那么他们的差就是一个负数,这是错误的。因为这个时候最大值减去K就不是B中的最大值了。但不用灰心,我们总的思路是对的,这里只需要对他们的差进行判断。如果差小于0,说明A最大值减去K之后就比A最小值加上K小,也就是说,我们能够找到一个x,x < K,使得A最大值减去x==A最小值加上x,这里x可能为小数。
Solution
按照上面的方法编程即可,没有特别难的地方。
Code
1 | class Solution { |
运行时间:约20ms,超过46.24%的CPP代码。
Summary
这道题的难点在于对diff<0的处理,需要在纸上自己证明一下x的存在性,其他就没什么难度了。本题的题析到此为止,谢谢您的支持!