题目:
给定一个整数数组 A
,对于每个整数 A[i]
,我们可以选择 x = -K
或是 x = K
,并将 x
加到 A[i]
中。
在此过程之后,我们得到一些数组 B
。
返回 B
的最大值和 B
的最小值之间可能存在的最小差值。
思路:
首先排序,可以想到,大一些的估计都要-k,小一些的都要+k,但是这个分割点不好确定,所以循环遍历查找这个分割点就行。
然后需要注意的是,分割点找到之后需要再次确认最大值和最小值。
重点就在于确认变换之后的最大值和最小值。
代码:
class Solution {
public:
int smallestRangeII(vector<int>& A, int K) {
int sz = A.size();
if(sz==1||sz==0)return 0;
sort(A.begin(),A.end());
if(A[sz-1]-A[0]>=4*K)return A[sz-1]-A[0]-2*K;
else {
int ma = A[sz-1]-A[0];
for(int i=1;i<=sz-1;i++){
int mi = -1;
int ab = min(A[i]-K,A[0]+K);
int bb = max(A[i-1]+K,A[sz-1]-K);
mi = max(mi,bb-ab);
ma = min(ma,mi);
}
ma = min(ma,A[sz-1]-A[0]);
return ma;
}
return 0;
}
};
最大值和最小值大于4*K的话是一种特殊情况。
精简代码:
class Solution {
public:
int smallestRangeII(vector<int>& A, int K) {
sort(A.begin(),A.end());
int n=A.size(),i,ans=A.back()-A.front();
for(i=0;i+1<n;i++)ans=min(ans,max(A[i]+K,A[n-1]-K)-min(A[0]+K,A[i+1]-K));
return ans;
}
};
这代码写的。。。