1. 程式人生 > >leetcode 910. 最小差值 II

leetcode 910. 最小差值 II

題目:

給定一個整數陣列 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;
    }
};

這程式碼寫的。。。