题目描述
给定一个整数数组 A
,对于每个整数 A[i]
,我们可以选择 -K <= x <= K
,并将 x
加到 A[i]
中。
在此过程之后,我们得到一些数组 B
。
返回 B
的最大值和 B
的最小值之间可能存在的最小差值。
样例
输入:A = [1], K = 0
输出:0
解释:B = [1]
输入:A = [0,10], K = 2
输出:6
解释:B = [2,8]
输入:A = [1,3,6], K = 3
输出:0
解释:B = [4,6,3]
注意
1 <= A.length <= 10000
0 <= A[i] <= 10000
0 <= K <= 10000
算法
(线性扫描) $O(n)$
- 求出数组中的最大值和最小值,如果最大值和最小值的差值小于等于 2K,则答案为 0;否则答案为差值减去 2K。
时间复杂度
- 仅遍历一次数组,时间复杂度为 $O(n)$。
空间复杂度
- 仅需要常数的空间。
C++ 代码
class Solution {
public:
int smallestRangeI(vector<int>& A, int K) {
int minr = INT_MAX, maxr = 0;
for (auto x : A) {
minr = min(minr, x);
maxr = max(maxr, x);
}
return max(0, maxr - minr - 2 * K);
}
};