leetcode 910 最小差值II
题目描述:
给定一个整数数组 $A$,对于每个整数 $A[i]$,我们可以选择 $x = -K$ 或是 $x = K$,并将 $x$ 加到 $A[i]$ 中。在此过程之后,我们得到一些数组 $B$。返回 $B$ 的最大值和 $B$ 的最小值之间可能存在的最小差值。
题解:
首先将数组 $A$排序,为了让最大值与最小值的gap最小化,我们期望较小的值加上$k$,较大的值减去$k$。那么对于已经排序的数组,我们希望找到一个位置$i$,使得$A[0],A[1],...,A[i-1]$的数字都$+k$,$A[i],A[i+1],...,A[len-1]$的数字都$-k$。这样以$A[i]$为界限可以得到两个递增的序列,那么最小值$ = min(A[0]+k,A[i]-k)$,最大值$ = max(A[i-1]+k , A[len-1] - k)$。遍历所有的$i$就可以得到最终的解了。代码如下:
class Solution { public: int smallestRangeII(vector<int>& A, int K) { sort(A.begin(),A.end()); int len = A.size(); if(len == 0) return 0; int ans = A[len-1] - A[0]; for(int i=1;i<len;i++) { int l,r; l = min(A[0]+K,A[i]-K); r = max(A[i-1]+K,A[len-1]-K); ans = min(ans,r - l); } return ans; } };