给定一个整数数组 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 输出:0 解释:B = [3,3,3] 或 B = [4,4,4]
提示:
1 <= A.length <= 10000
0 <= A[i] <= 10000
0 <= K <= 10000
【思路】该题猛一看好像很复杂,其实意思就是给一个数组,然后又给一个K值,让你在-K到K里面找任意值(整数)加到数组的每个值上;换句话说,A数组里面的值随便加,前提是加的值范围为-K到K之间。然后再看变完后的数组里面最大值和最小值差值最小的情况。
其实,这样想,举个例:假如A数组最大值是10,最小值是0,只要K>=5,就能让A里面所有的值加成都是5这种情况吧,那返回值就是0,所以分情况:
1.数组长度为1,返回 0;
2.最大值-最小值>=2K,返回 最大值-最小值-2K;
3.最大值-最小值>=2K,返回 0;
class Solution {
public:
int smallestRangeI(vector<int>& A, int K) {
int i ;
int ret;
for(i = 0; i < A.size()-1; i++)
{
if(A[i] < A[i+1])
{
int temp = A[i];
A[i] = A[i+1];
A[i+1] = temp;
}
}
int min = A[A.size()-1];
for(i = 0; i < A.size()-1; i++)
{
if(A[i] > A[i+1])
{
int temp = A[i];
A[i] = A[i+1];
A[i+1] = temp;
}
}
int max = A[A.size()-1];
if(A.size() <= 1) ret = 0;
if(max - min >= 2 * K) ret = max - min - 2 * K;
if(max - min < 2 * K) ret = 0;
return ret;
}
};