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;
    }
};

 

posted @ 2020-05-29 15:56  猪突猛进!!!  阅读(163)  评论(0编辑  收藏  举报